我正在使用一个ASP.NET Web项目,该项目通过按钮触发视图,该按钮触发通过MSMQ向Rebus发送消息。消息处理程序是长时间运行的操作(15-30分钟),我希望rebus命令处理程序在处理消息期间向Web发送更新。
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将状态消息推送到客户端。一切正常,除了所有CommandStatusReply消息都是在批处理中发送的#34;何时处理了ImportProducts消息。我希望他们立即发送。这可能吗?在那种情况下,我错过了什么?
我尝试过Bus.Send(),Bus.Reply()和Bus.Publish(),并尝试在TransactionScope(TransactionScopeOptions.Suppress)中包装Bus.Reply / Send无效。
答案 0 :(得分:2)
您可以使用其他总线报告进度,但您也需要使用其他传输 - 否则,其他总线将在同一MSMQ事务中登记其MSMQ发送操作收到当前正在处理的消息,并且在成功处理消息后,您仍然拥有所有队列操作的相同原子提交。
IMO总线不太适合报告这样的进展 - 我更喜欢更轻量级的东西,例如SignalR。
您可以轻松地使用Rebus处理程序中的SignalR呼叫您的SignalR集线器并让集线器向客户端发布进度 - 我自己已经完成了几次这样做,它就像一个魅力:)