10

目前我的主要功能,服务器开始的地方看起来像这样

#[actix_rt::main]
async fn main() -> std::io::Result<()> {
    let address = "0.0.0.0:3000";

    HttpServer::new(move || {
        let app_state = {...some state};
        App::new()
            .data(app_state)
            .wrap(middleware::Logger::default())
            .service(network_api::init_service())
    })    
    .bind(address)?
    .run()
    .await
}

一旦服务器启动,我想运行一个(异步)函数,向另一台服务器发出请求,并且该服务器应该向刚刚启动并运行的该服务器发出另一个请求。

不确定我在文档中是否看到任何提及仅在服务器启动时运行一次的回调函数。

例如,也许有它的run()功能,像这样:

run(|| {
  // server started now perform some request or whatever
  Client::new().post(&url).json(json_stuff).send().await
})

编辑 我想我解决了,当我可以回答我自己的问题时会发布答案

4

2 回答 2

2

我通过加入 2 个异步函数解决了这个问题,创建了另一个异步函数

async fn another_func() -> Result<()> {
...
}

并像这样使用了future::join()

let server = HttpServer::new(move || {
        let app_state = {...some state};
        App::new()
            .data(app_state)
            .wrap(middleware::Logger::default())
            .service(network_api::init_service())
    })    
    .bind(address)?
    .run();

future::join(server, another_func()).await;

Ok(()

当然,如果有人有更好的答案,请发布

于 2020-06-14T13:09:22.997 回答
0

我实际上有点挣扎,最终用 tokio join 替换了 future::join !宏如下:

tokio::join!(server, utils::open_web_app(server_address));

Ok(())
于 2020-10-10T13:01:23.113 回答