Actix-Web: запуск службы каждые 10 секунд

#rust #actix-web

#Ржавчина #actix-web

Вопрос:

В настоящее время я внедряю сервер с использованием Rust и Actix-Web. Теперь моя задача — отправлять запрос (ping-запрос) с этого сервера на другой сервер каждые 10 секунд. Сам запрос ping реализован в async функции:

 async fn ping(client: web::Data<Client>, state: Data<AppState>) -> Result<HttpResponse, Error> {}
  

Это моя простая серверная основная функция:

 #[actix_rt::main]
async fn main() -> std::io::Result<()> {
    ::std::env::set_var("RUST_LOG", "debug");
    env_logger::init();
    let args = config::CliOptions::from_args();
    let config =
        config::Config::new(args.config_file.as_path()).expect("Failed to config");
    let address = config.address.clone();
    let app_state = AppState::new(config).unwrap();

    println!("Started http server: http://{}", address);

    HttpServer::new(move || {
        App::new()
            .data(app_state.clone())
            .app_data(app_state.clone())
            .data(Client::default())
            .default_service(web::resource("/").route(web::get().to(index)))
    })
    .bind(address)?
    .run()
    .await
}
  

Я пытался использовать tokio , но это было слишком сложно, потому что все разные асинхронные функции и их время жизни.

Итак, есть ли какой-нибудь простой способ в actix-web выполнять эту функцию ping (возможно, как службу) каждые 10 секунд после запуска сервера?

Спасибо!

Комментарии:

1. Используется actix::spawn для запуска задачи, которая использует tokio::time::delay_for в цикле ожидание 10 секунд и выполнение запроса?

2. Также существует run_interval функция, которая «периодически запускает задание для выполнения данного закрытия с заданным фиксированным интервалом».

Ответ №1:

См. actix_rt::spawn и actix_rt::time::interval .

Вот пример:

 spawn(async move {
    let mut interval = time::interval(Duration::from_secs(10));
    loop {
        interval.tick().await;
        // do something
    }
});
  

Ответ №2:

 #[get("/run_c")]
async fn run_c() -> impl Responder {
    //tokio::time::delay_until(Duration::from_secs(5)).await;
    //time::interval(period)
    let mut interval = time::interval(Duration::from_millis(10));
    loop {
        interval.tick().await;
        print!("hello");
        HttpResponse::Ok().body("Hello world!");
    }

}
  

Это работает, но единственное, что он не будет возвращать http-ответ вызывающему