【问题标题】:Replies with immediate execution during message handling in ReBus在 ReBus 中的消息处理期间立即执行回复
【发布时间】:2015-04-16 12:13:23
【问题描述】:

我正在使用一个 ASP.NET Web 项目,该项目提供一个带有按钮的视图,这些按钮触发消息通过 MSMQ 发送到 Rebus。消息处理程序是长时间运行的操作(15-30 分钟),我希望 rebus 命令处理程序在处理消息期间向网络发送更新。

public void Handle(ImportProducts message)
{
    _bus.Send(new CommandStatusReply("Starting up import products job..."));
    // One operation that takes about a minute
    _bus.Send(new CommandStatusReply("Step one completed. processing..."));
    // Another operation that takes a while
    ...
}

在我的 Web 应用程序中,我有一个 CommandStatusReply 处理程序,它将通过 SignalR 将状态消息推送到客户端。一切正常,除了在处理 ImportProducts 消息时“批量”发送所有 CommandStatusReply 消息。我希望他们立即发送。这可能吗?在那种情况下,我错过了什么?

我尝试过 Bus.Send()、Bus.Reply() 和 Bus.Publish(),还尝试将 Bus.Reply/Send 包装在 TransactionScope(TransactionScopeOptions.Suppress) 中,但无济于事。

【问题讨论】:

  • 我的天真尝试会是另一个总线实例,但我想这是个坏主意。从 Mookid 那里听到为什么这是坏/好主意会很有趣 :)
  • 谢谢 - 我明天试试!

标签: .net rebus


【解决方案1】:

可以使用另一条总线来报告进度,但您也需要使用另一条传输 - 否则,另一条总线将在接收到的同一 MSMQ 事务中征用其 MSMQ 发送操作当前正在处理的消息,并且在成功处理消息后,您仍然拥有所有队列操作的相同原子提交。

IMO 总线并不真正适合报告这样的进度 - 我更喜欢更轻量级的东西,例如SignalR。

您可以轻松地使用 Rebus 处理程序中的 SignalR 调用 SignalR 集线器,并让集线器将进度发布到客户端 - 我自己已经这样做了几次,它就像一个魅力 :)

【讨论】:

  • 感谢您的意见!这实际上是我最终做的,就像你说的,就像一个魅力!
猜你喜欢
  • 1970-01-01
  • 2013-05-26
  • 2021-12-05
  • 1970-01-01
  • 1970-01-01
  • 2015-01-12
  • 1970-01-01
  • 1970-01-01
  • 2020-12-17
相关资源
最近更新 更多