NServiceBus:强制发布者在发布之前在启动时处理订阅请求



我有一个自托管的NSB进程,它可能会在启动后立即开始发布事件。根据我的观察,当内部NSB运行时启动时,它将在一个单独的线程(而不是接收发布请求的线程)上开始处理订阅请求,延迟几秒钟。然后,在这种情况下,新订阅者虽然在"商店开业"之前提交了订阅请求,但在"商店开张"之后仍然会错过前几次发布。

只有在完成了流程开始时已在队列中提交的所有订阅请求之后,我才能强制NSB执行第一次发布?

像这样的竞争条件需要通过在订阅服务器联机之前用订阅服务器"启动"订阅存储来处理。

简而言之:将行/文档直接插入订阅数据库

我更喜欢@Gary Zhang关于MessageDriveSubscribeManager的想法。虽然这仍然不可用(在v5中)。

这是我的解决方案。

// 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); 
        } 
}

最新更新