2014-09-26 30 views
0

我有一個自託管的NSB進程,可能會在啓動時立即開始發佈事件。在我看來,當內部NSB運行時啓動時,它將開始在一個單獨的線程(不是收到發佈請求的線程)上處理訂閱請求,延遲幾秒鐘。然後在這種情況下,雖然在「開店」之前提交了訂閱請求,但新訂閱者仍然會錯過「開店之後」的前幾個發佈。NServiceBus:強制發佈者在發佈之前在啓動之前處理訂閱請求

我該如何強制NSB在完成在流程開始時已經在隊列中提交的所有訂閱請求之後才進行第一次發佈?

回答

1

像這樣的競爭條件需要通過在用戶上線之前用訂閱「預訂」訂閱存儲來處理。

簡而言之:插入行/文檔直入訂閱數據庫

+0

當特定的衛星啓動器完成其工作時是否可以通知MessageDrivenSubscriptionManager? – 2014-09-26 19:48:36

+0

目前不在。在下標的情況下,它們由主「接收器」處理,以便對您有所幫助。 – 2014-10-02 16:46:41

0

我寧願MessageDrivenSubscriptionManager的@Gary張的想法。儘管這還不是可用的(在第5版中)。

這是我的解決方案。

// Wait for the thread that handles subscription messages to finish before publishing anything to remove risk of missing subscibers 

StringBuilder QueueName = new StringBuilder(Environment.MachineName); 
QueueName.Append("\\private$\\"); 
QueueName.Append(MethodBase.GetCurrentMethod().DeclaringType.Namespace.ToLower()); 

using (System.Messaging.MessageQueue queue = new System.Messaging.MessageQueue(QueueName.ToString())) 
{ 
    while (queue.GetAllMessages().Length > 0) 
    { 
     Thread.Sleep(1000); 
     } 
}