внедрить таймаут в Rust - PullRequest
0 голосов
/ 02 мая 2020

В поисках чистого способа реализовать оболочку тайм-аута на моем приемнике zmq от ржавчины. Любые общие советы по моему коду также приветствуются, это мой третий день в изучении ржавчины.

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
  )

1 Ответ

0 голосов
/ 02 мая 2020

Вы можете использовать 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) => {
      // ...
   }
}
...