我设置了一个简单的测试,包括一个发布者和两个订阅者,所有订阅者都在使用 MSMQ 和 MassTransit (2.1.1) RuntimeServices 的单台机器上运行,后者使用本地 Sql Server 数据库。
我在下面包含了总线设置代码,因此您可以查看设置的内容。我正在手动和独立地启动每个组件,以尝试锻炼如果订阅者没有运行会发生什么。
我首先运行了两个订阅者,因此队列和订阅都已设置好,然后将它们都退出,而无需取消订阅消息。如果然后我自己运行发布者,它会尽可能快地在队列中转储 400 条消息,我可以看到两个订阅者队列有不同数量的消息等待。
我的假设是我在 RuntimeServices 能够自行设置两个目标队列之前发布。在总线设置和发布之间有 5 秒的延迟,我得到了我期望的 400 条消息在两个订阅者队列中等待,即一些消息没有发布到两个队列。
我的问题是这个;当发布者启动时,有没有办法判断 RuntimeServices 是否已准备好其数据库中已有的订阅者?
这是发布者代码
Bus.Initialize(sbc =>
{
sbc.SetCreateTransactionalQueues(true);
sbc.ReceiveFrom("msmq://localhost/andy_publisher");
sbc.UseSubscriptionService("msmq://localhost/mt_subscriptions");
sbc.UseMsmq();
sbc.VerifyMsmqConfiguration();
});
var bus = Bus.Instance;
Thread.Sleep(5000); // this makes it all work :)
int i = 0;
foreach (string filename in System.IO.Directory.EnumerateFiles(@"C:\Users\andy.baker\Pictures\", "*.*", SearchOption.AllDirectories))
{
Console.WriteLine(filename);
bus.Publish(new Messages.FileRegistered {FilePath = filename});
i++;
}
Console.WriteLine("Published {0} messages", i);
Console.ReadLine();
订阅者是这样配置的;
Bus.Initialize(sbc => {
sbc.UseMsmq();
sbc.VerifyMsmqConfiguration();
sbc.ReceiveFrom("msmq://localhost/andy_subscriber1");
sbc.UseSubscriptionService("msmq://localhost/mt_subscriptions");
}
);
...和第二个订阅者...
Bus.Initialize(sbc =>
{
sbc.UseMsmq();
sbc.VerifyMsmqConfiguration();
sbc.ReceiveFrom("msmq://localhost/andy_subscriber2");
sbc.UseSubscriptionService("msmq://localhost/mt_subscriptions");
}
提前感谢您的任何建议。