2011-01-25 41 views
1

我調查NServiceBus,而且我不確定我如何(或者即使)可以用它來處理這種情況:NServiceBus分銷商能否從工人報告進度?

我有多個客戶端發送的工作請求,該經銷商從農場工人。這項工作需要很長時間才能完成,我希望工作人員向發送原始請求的客戶報告進度。

我已經看過全雙工樣品和how to add the distributor to that sample。我有這些工作,但是當我修改它們以回覆一系列進度消息(消息之間存在延遲,如下所示的代碼)時,客戶端會同時收到所有進度消息。

public class RequestDataMessageHandler : IHandleMessages<RequestDataMessage> 
{ 
    public IBus Bus { get; set; } 

    public void Handle(RequestDataMessage message) 
    { 
     for (var i = 0; i < 10; i++) 
     { 
      var count = i; 
      var response = this.Bus.CreateInstance<DataResponseMessage>(m => 
       { 
        m.DataId = message.DataId; 
        m.Progress = count * 10; 
       }); 

      this.Bus.Reply(response); 

      Thread.Sleep(1000); 
     } 
    } 
} 

我懷疑我還沒有理解NSe​​rviceBus的工作原理。有人可以解釋我出錯的地方,或者指出我的一些例子和/或文檔嗎?

+0

你能顯示的是代碼嗎? – Paco 2011-01-25 15:39:57

回答

2

您構建的內容始終將消息作爲同一事務的一部分發送。由於每個處理程序都有一個事務,所以您將無法通過這種方式來傳遞進度。您將不得不爲每個會傳達進度的處理塊設置單獨的端點。我們通過更新外部事務而不涉及事務來實現通信進度。這可以通過向另一個端點發送一個非事務性消息來更新進度或RPC調用等來完成。從那裏你可以得到一些進展數據存儲的輪詢。

1

讓您的員工使用bus.Reply()將消息發回給您的客戶。回覆將自動發送消息到發送原始消息的端點

+0

我正在使用Bus.Reply() - 我已經向原始問題添加了一個代碼示例。問題是答覆全部同時到達客戶端(當服務器完成Handle()方法時)而不是間隔開。 – Akash 2011-01-25 20:07:32

+0

上面的亞當斯回答解釋了爲什麼會發生這種情況。我同意他建議的方法,將您的流程分成不同的塊(可能是通過執行bus.SendLocal)。另一個「hackish」選項是將這些總線封裝。回覆一個新的TransactionScope(ScopeOptions.Supress)。這將導致回覆立即發送 – 2011-01-26 12:44:54