У меня есть служба, которая обновляет данные кеша с фиксированным интервалом. Каждые N секунд он будет запускать будущее с использованием цикла (tokio::run(future_update(http_client.clone()))
), но он не возвращается в родительскую функцию, в которой было разрешено будущее. Цикл блокируется, и я получаю только одну итерацию.
Когда я создаю новый гипер-HTTP-клиент вместо того, чтобы передавать клонированный, все работает правильно. Не работает Arc<Client>
тоже.
pub fn trigger_cache_reload(http_client: Arc<Client<HttpConnector, Body>>) {
let load_interval_sec = get_load_interval_sec(conf.load_interval_seconds.clone());
std::thread::spawn(move || loop {
let http_client = http_client.clone();
info!("Woke up");
tokio::run(pipeline(http_client));
info!(
"Pipeline run complete. Huuhh Now I need sleep of {} secs. Sleeping",
load_interval_sec
);
std::thread::sleep(std::time::Duration::from_secs(load_interval_sec));
});
}
fn pipeline(
client: Arc<Client<HttpConnector, Body>>,
) -> Box<dyn Future<Item = (), Error = ()> + Send> {
let res = fetch_message_payload() //return type of this call is Box<dyn Future<Item = (), Error = Error> + Send>
.map_err(Error::from)
.and_then(|_| {
//let client = hyper::Client::builder().max_idle_per_host(1).build_http();
//if i create new client here every time and use it then all working is fine.
refresh_cache(client) //return type of this call is Box<dyn Future<Item = (), Error = Error> + Send>
.map_err(Error::from)
.and_then(|arg| {
debug!("refresh_cache completed");
Ok(arg)
})
});
let res = res.or_else(|e| {
error!("error {:?}", e);
Ok(())
});
Box::new(res)
}
После однократного вызова trigger_cache_reload
я получаю сообщение журнала "woke up"
. Я также получаю "refresh_cache completed"
сообщение журнала через некоторое время при успешном завершении future. Я не получаю "sleeping"
сообщение журнала с Arc
или без него.
Если я каждый раз создаю нового клиента внутри будущего, я могу получать "sleeping"
сообщений журнала.