我正在寻找一种干净的方法来实现我的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
)
你可以使用 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) => {
// ...
}
}