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

时间:2015-04-16 12:13:23

标签: .net rebus

我正在使用一个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无效。

1 个答案:

答案 0 :(得分:2)

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

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

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