0

我已经为此苦苦挣扎了一段时间,只是在兜圈子,所以我希望有人能指出我哪里出错了。

我正在玩 Actix Web,并设置我的第一个处理程序 - 这是系统的简单健康检查。所以我得到的是:

  • Healthcheck定义健康检查的特征
  • 一个HealthcheckHandler实现Handler特征的结构(这是一个 Actix Web 概念)并包含一个 HashMap
  • 一个为健康检查路由构建App 实例的函数(这是一个 Actix Web 概念),通过HashMap<String, &Healthcheck>

​​​

当我尝试构建它时,我得到了特征“无法安全地在线程之间发送”的错误。

我已经尝试过&Healthcheck, Box<Healthcheck>,Box<Healthcheck + Send>基于此处的另一个答案,甚至Mutex<&Healthcheck>都没有运气,但都有细微的不同错误。这一切似乎都需要实现一些同步、发送和/或克隆的组合,但我不知道如何在这里解决这个问题。

任何指向我应该解决这个问题的方法?

​​​

实际示例代码:

pub trait Healthcheck {
    fn check(&self) -> Result<String, String>;
}
struct HealthcheckHandler {
    handlers: HashMap<String, Box<Healthcheck>>,
}
pub fn build_app(handlers: HashMap<String, Box<Healthcheck>>) -> App<()> {
    let handler = HealthcheckHandler {
        handlers: handlers,
    };

    App::new()
        .prefix("/health")
        .resource("", |r| {
            r.get().h(handler);
        })
}
pub fn start(settings: HashMap<String, String>) {
    let mut healthchecks: HashMap<String, Box<Healthcheck>> = HashMap::new();

    let server = server::new(|| { // <-- This is where the errors happen. This closure is used to spawn threads.
        vec![
            build_app(healthchecks).middleware(middleware::Logger::default())
        ]
    });
}

干杯

4

0 回答 0