2014-09-26 52 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); 
     } 
} 
相关问题