2015-04-16 45 views
3

我正在使用一個ASP.NET web項目,該項目提供按鈕觸發通過MSMQ向Rebus發送消息的視圖。消息處理程序是長時間運行的操作(15-30分鐘),我希望rebus命令處理程序在處理消息期間向Web發送更新。在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(),並試圖在TransactionScope(TransactionScopeOptions.Suppress)中包裝Bus.Reply /發送無濟於事。

+0

我的天真嘗試會有另一個巴士的實例,但我想這是個壞主意。從Mookid聽到爲什麼它很糟糕/好主意會很有趣:) – user1121956

+0

謝謝 - 明天我會試一試! –

回答

2

可能使用另一條總線報告進度,但您需要使用另一個傳輸 - 否則另一條總線將在收到當前消息的同一個MSMQ事務中徵用其MSMQ發送操作處理完畢,並且在消息成功處理後,您仍然擁有所有隊列操作的原子提交。

國際海事組織的巴士不太適合報道這樣的進展 - 我更喜歡更輕量化的東西, SignalR。

您可以輕鬆使用來自您的Rebus處理程序的SignalR調用您的SignalR中心,並讓中心向客戶端發佈進度 - 我自己做了幾次,而且它的工作原理類似於一個魅力: )

+1

感謝您的輸入!這實際上是我最終做的,就像你說的那樣,它就像一種魅力! –

相關問題