2009-10-28 115 views
1

我剛開始玩nservice總線,並試圖讓出版工作。我有一個聽衆,似乎缺少一些消息。它被配置爲NServiceBus監聽器丟失信息

<MsmqTransportConfig 
    InputQueue="InformMessages" 
    ErrorQueue="error" 
    NumberOfWorkerThreads="5" 
    MaxRetries="5" 
/> 

有趣的是,如果我將NumberOfWorkerThreads設置爲1,它始終會漏掉其他所有消息。對於較大的值,它似乎不那麼確定。在我的消息處理程序我有

class MessageHandler : IMessageHandler<ICourseRegister> 
{ 
    public void Handle(ICourseRegister message) 
    { 
     Console.WriteLine("Message dun got gotted"); 
     Console.WriteLine("Course name is: " + message.CourseName); 
    } 

    private IBus bus; 
    public IBus Bus 
    { 
     set { this.bus = value; } 
    } 
} 

和總線配置了

 var bus = NServiceBus.Configure.With() 
       .SpringBuilder() 
       .XmlSerializer() 
       .MsmqTransport() 
        .IsTransactional(true) 
        .PurgeOnStartup(false) 
       .UnicastBus() 
        .ImpersonateSender(false) 
        .LoadMessageHandlers() 
       .CreateBus() 
       .Start(); 

有沒有這樣的,它被釋放準備接收下一條消息或東西,我需要做的,處理程序結束我需要做一些配置,以便在處理程序繁忙時有一個客戶端隊列來保留消息。發送消息之間的時間似乎並不重要,可能是20秒,聽衆仍然無法獲得所有消息。

回答

5

在看過您發送的解決方案後,我看到了問題所在。

您已經爲兩個進程(發佈者和訂閱者)指定了相同的輸入隊列。因此,你們有兩個進程與我打算只發送給訂閱者的消息(我認爲)發生衝突。

給每個進程自己的輸入隊列,一切都應該是正確的與世界:-)

+0

就是這樣,謝謝。 – stimms 2009-11-03 17:53:57

0

如果您的工作類似於pub/sub示例,您可能會看到的是「多態訂閱」。

在pub/sub示例中,發佈者交替地發佈IEvent接口和具體類EventMessage(它繼承IEvent)。

如果訂閱者訂閱了具體的類,那麼它將不會收到接口消息。對於各種層次結構都是如此,如果您訂閱了特定的類,並且發佈者發佈了其基類類型的消息,則不會分發消息。

多態訂閱可以反過來工作。如果您訂閱該基地,則發佈商發佈的任何子類都將到達。

這與線程無關。

希望有所幫助。

+0

我不相信是這樣。我出版ICourseRegister:bus.Publish (m => m.CourseName =「Swimming 10」+ i); 並偵聽相同 類的MessageHandler:IMessageHandler { 公共無效手柄(ICourseRegister消息) ... 如果我修改我的項目中使用bus.Send從聽者複製MessageEndpointMappings節發佈者收到每封郵件。 – stimms 2009-10-29 14:27:30

+0

您可以發送您的解決方案,以便我可以查看該錯誤是否可以被複制? – 2009-10-29 15:41:58