MassTransit MSMQ Pub with multi-sub。 RuntimeServices什么时候准备好了?

时间:2012-05-29 16:00:14

标签: msmq publish-subscribe masstransit

我已经设置了一个简单的测试,其中包含一个拥有两个订阅者的发布者,所有这些都使用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");
        }

提前感谢任何建议。

1 个答案:

答案 0 :(得分:1)

您如何订阅您的消费者? 为了生存重启,它们应该是永久性的。 http://docs.masstransit-project.com/en/latest/configuration/sub_config_api.html

s.Consumer<TConsumer>().Permanent();