当前位置: 首页 > 知识库问答 >
问题:

如何通过期货通道将异步消息发送到接收器?

寇景明
2023-03-14

我曾经能够做到这一点,但我正在努力应对0.3的期货。

下面是我从WebSocket获得的一个sink和stream:

let (mut sink, stream) = ws_stream.split();

我创建了一个在异步tokio任务之间通信的无界通道:

let (unbounded_sender, unbounded_receiver) = mpsc::unbounded::<tungstenite::Message>();

这是我被卡住的部分。我生成了一个异步任务,它应该连接无界接收器和接收器;我的想法是通过< code>unbounded_sender发送消息:

tokio::spawn(async {
    sink.send_all(&mut unbounded_receiver);
    Ok(())
});

对于<code>send_all</code>,错误消息显示:

 " expected enum `tungstenite::protocol::message::Message`, found enum `std::result::Result`"

而且

"type mismatch resolving `<futures_channel::mpsc::UnboundedReceiver<tungstenite::protocol::message::Message> as futures_core::stream::Stream>::Item == std::result::Result<_, _>`"

而且

type mismatch resolving `<futures_channel::mpsc::UnboundedReceiver<tungstenite::protocol::message::Message> as futures_core::stream::Stream>::Item == std::result::Result<tungstenite::protocol::message::Message, tungstenite::error::Error>`

查看文档,我可以看到< code>unbounded_receiver实现了< code>TryStream特征,这是< code>send_all所需要的,所以我不确定该怎么做。

共有1个答案

陶鸿畴
2023-03-14

Futures现在需要无限通道来实现Futures_ core::stream::TryStream

这可以像将每条消息包装在Ok结果中一样简单地完成:

    sink.send_all(
        &mut unbounded_receiver.map(Ok::<tungstenite::Message, tungstenite::error::Error>),
    );
 类似资料:
  • 我正在创建一个不和谐机器人,它每天在某个时间向公会发送消息。我使用为预定的消息,但不确定为机器人编写什么代码来将消息发送到公会的一般频道,如果他们没有一般频道,则发送到带有大多数活动或消息。 由于已被删除,我不确定该如何执行此操作。另外,我不想使用通道id将消息发送到特定的通道,因为我想将此bot公开,以便许多不同的协会可以使用。 它不一定要发送到“默认”频道或包含大多数消息的频道。这些正是我想到

  • 我目前正在使用Java和jda为discord制作一个机器人。我想让机器人向特定的通道发送消息。我该怎么做?

  • 我有一个web应用程序,它通过WebLogic中的JMS与其他Java web应用程序通信。 我读到这样的答案:如何从PHP连接Jms? 我安装了ActiveMQ并尝试使用它。但是在Weblogic中,我们需要“jms_factory”和“queue_name”。我想它使用t3协议。

  • 我正在为我的Discord服务器创建一个bot。 我的服务器中有一个新的用户通道。当新用户加入时,我想向这个频道发送欢迎消息。但是,我不知道如何才能访问新用户的渠道。

  • 我有一个简单的JMS主题侦听器,我希望将它与spring-integration链挂钩。 基本上,当在侦听器中接收到JMS消息时,必须将其推入链的通道中。最终,消息被处理并推送到出站通道适配器中使用。 Spring Integration文档提到了异步网关的使用,但它使用了未来。难道没有一种简单的方法可以把消息放在频道上吗? 如果有一个可以指向的例子,那就太好了。 谢谢 问候 马丁