通过MSMQ的MassTransit无法正常工作,为什么?

时间:2013-01-23 03:04:25

标签: c# masstransit

这是我的MassTransit代码。

订阅者控制台应用:

namespace ConsoleSubscriber
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("set up a subscriber");

            Bus.Initialize(config =>
            {
                config.UseMsmq();
                config.VerifyMsmqConfiguration();
                config.UseMulticastSubscriptionClient();
                config.UseControlBus();
                config.ReceiveFrom("msmq://localhost/test_end");
                config.Subscribe(s => s.Instance(new Consumer()).Permanent());                    
            });

            Console.Read();
        }         
    }

    public class Consumer : Consumes<Message>.All
    {
        public void Consume(Message message)
        {
            Console.WriteLine("start consuming message");

            if (string.IsNullOrEmpty(message.Ids))
            {
                Console.WriteLine("no ids");     
            }
            else
            {
                Console.WriteLine("ids are " + message.Ids);
            }
        }
    }
}

消息类:

[Serializable]
public class Message
{
    public string Ids { get; set; }
}

发布商控制台应用:

namespace ConsolePublisher
{
    class Program
    {
        static void Main(string[] args)
        {                
            Console.WriteLine("start publishing");

            // initialize bus 
            Bus.Initialize(config =>
            {
                config.UseMsmq();
                config.VerifyMsmqConfiguration();
                config.UseMulticastSubscriptionClient();
                config.UseControlBus();
                config.ReceiveFrom("msmq://localhost/test_queue");
            });

            Bus.Instance.Publish(new Message());
            Console.WriteLine("Message sent 1");

            var msg2 = new Message() { Ids ="1,2,3,4" };
            Bus.Instance.Publish(msg2);
            Console.WriteLine("Message sent 2");

            Console.Read();    
        }
    }
}

当我运行这两个控制台应用程序时,消费者似乎没有收到消息。有什么想法吗?

干杯!

1 个答案:

答案 0 :(得分:6)

在调用发布之前尝试进入睡眠状态。多播订阅可能需要一些时间来配置,因为两个实例正在相互通信。还要确保您在发布者之前启动了消费者。将config.Subscribe(s => s.Instance(new Consumer()).Permanent());替换为config.Subscribe<Consumer>();可能会有所帮助。

一旦您继续前进,还有其他路由方法可以在重新启动流程之间保留订阅数据。我会开始考虑使用订阅服务,静态路由,或者只要使用RabbitMQ就可以了解它。