在Rust中实现超时

问题描述 投票:0回答:1

我正在寻找一种干净的方法来实现我的zmq接收器上的超时包装器,在rust中。任何关于我的代码的一般性建议也将受到欢迎,这是我探索rust的第三天。

pub struct Manager {
  conn: zmq::Socket,
  server: String,
}

impl Manager {
  pub async fn send_message(
    self: &Self,
    subject: String,
    queue: String,
    message: json::JsonValue,
  ) -> json::JsonValue {
    let mut msg = zmq::Message::new();

    let data = object! {
      messageID: Ulid::new().to_string(),
      requester: self.server.to_string(),
      subject: subject,
      queue: queue,
      payload: message,
    };

    self.conn.send(&data.dump(), 0).unwrap();
    self.conn.recv(&mut msg, 0).unwrap();
    println!("Message Received {}", msg.as_str().unwrap());

    match msg.as_str() {
      Some(response) => json::parse(response).unwrap(),
      None => json::parse(r#" { "status": "error", "error": "unable to parse data" } "#).unwrap(),
    }
  }
}

然后从不同的包中调用它

let resp: json::JsonValue = messager
    .send_message("subject".to_string(), "queue".to_string(), data)
    .await;

理想的情况下,我正在寻找一个干净的方式来和一个。i8 到我的调用函数中,然后有一些类似于

pub async fn send_message(
    self: &Self,
    subject: String,
    queue: String,
    message: json::JsonValue,
    timeout: i8, // timeout in seconds
  )
rust zeromq
1个回答
0
投票

你可以使用 async_std::future::timeout. 当你有 Manager::send_message 实现了它在发送数据时不超时,你可以用下面的方式来包装。

use std::time::Duration;
use async_std::future;

let send_message_fut = messager
    .send_message("subject".to_string(), "queue".to_string(), data);

let dur = Duration::from_millis(5);
match future::timeout(dur, send_message_fut).await {
   Ok(resp) => {
      // ...
   },
   Err(err) => {
      // ...
   }
}
© www.soinside.com 2019 - 2024. All rights reserved.