在 ReBus 中处理消息期间立即执行回复

Replies with immediate execution during message handling in ReBus

我正在使用一个 ASP.NET 网络项目,该项目提供一个视图,其中包含触发消息通过 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 消息 "in a batch"。我希望他们立即发送。这可能吗?那样的话,我错过了什么?

我已经尝试了 Bus.Send()、Bus.Reply() 和 Bus.Publish(),还尝试将总线包装起来。Reply/Send 在 TransactionScope(TransactionScopeOptions.Suppress) 无济于事。

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

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

您可以轻松地使用 Rebus 处理程序中的 SignalR 来调用您的 SignalR 集线器并让集线器向客户端发布进度 - 我自己已经这样做过几次,而且效果很好:)