我正在使用一个 ASP.NET Web 项目,该项目提供一个带有按钮的 View ,这些按钮触发消息通过 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) 中,但无济于事。
最佳答案
您可以使用另一条总线来报告进度,但您也需要使用另一条传输 - 否则,另一条总线将在接收到的同一 MSMQ 事务中登记其 MSMQ 发送操作当前正在处理的消息,并且在成功处理消息后,您仍然可以对所有队列操作进行相同的原子提交。
IMO 总线并不适合报告这样的进度 - 我更喜欢更轻量级的东西,例如信号R。
您可以轻松地从 Rebus 处理程序中使用 SignalR 来调用 SignalR 集线器,并让集线器向客户端发布进度 - 我自己已经这样做过几次了,它的工作原理就像一个魅力:)
关于.net - 在 ReBus 中处理消息期间立即执行回复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29674398/