我有一个自托管的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);
}
}