使用MSMQ的MassTransit发布/订阅

时间:2015-03-29 15:38:31

标签: msmq masstransit

我刚刚开始使用MassTransit,并且找不到任何适合初学者的文档。 我确实在http://looselycoupledlabs.com/2014/06/masstransit-publish-subscribe-example/找到了一些示例代码,它显示了使用RabbitMQ的简单MassTransit发布/订阅示例

但对于我的公司,我需要使用MSMQ。 所以我删除了RabbitMQ引用:

x.UseRabbitMq();
x.ReceiveFrom("rabbitmq://localhost/MtPubSubExample_" + queueName);

并将其更改为使用MSMQ:

x.UseMsmq();
x.ReceiveFrom("msmq://localhost/MtPubSubExample_" + queueName);

启动订阅者和发布者时没有错误,我可以在发布者处输入消息但是他们似乎没有到达订阅者,消费代码从未被调用。

配置:

namespace Configuration
{
  public class BusInitializer
  {
    public static IServiceBus CreateBus(string queueName, Action<ServiceBusConfigurator> moreInitialization)
    {
      Log4NetLogger.Use();
      var bus = ServiceBusFactory.New(x =>
      {
        x.UseMsmq();
        x.ReceiveFrom("msmq://localhost/MtPubSubExample_" + queueName);
        moreInitialization(x);
      });

      return bus;
    }
  }
}

出版商:

static void Main(string[] args)
    {
      var bus = BusInitializer.CreateBus("TestPublisher", x => { });
      string text = "";

      while (text != "quit")
      {
        Console.Write("Enter a message: ");
        text = Console.ReadLine();

        var message = new SomethingHappenedMessage() { What = text, When = DateTime.Now };
        bus.Publish<SomethingHappened>(message, x => { x.SetDeliveryMode(MassTransit.DeliveryMode.Persistent); });
      }

      bus.Dispose();
    }

订户:

static void Main(string[] args)
    {
      var bus = BusInitializer.CreateBus("TestSubscriber", x =>
      {
        x.Subscribe(subs =>
        {
          subs.Consumer<SomethingHappenedConsumer>().Permanent();
        });
      });

      Console.ReadKey();

      bus.Dispose();
    }

未被调用的消费者代码:

class SomethingHappenedConsumer : Consumes<SomethingHappened>.Context
  {
    public void Consume(IConsumeContext<SomethingHappened> message)
    {
      Console.Write("TXT: " + message.Message.What);
      Console.Write("  SENT: " + message.Message.When.ToString());
      Console.Write("  PROCESSED: " + DateTime.Now.ToString());
      Console.WriteLine(" (" + System.Threading.Thread.CurrentThread.ManagedThreadId.ToString() + ")");
    }
  }

我还以为我可以看到消息存储在msmq中,但私有队列是空的。

我现在正在敲我的头2天,一定是想念一些明显的东西;非常感谢任何帮助。

我的环境:Windows 8.1教授与VS 2013教授

1 个答案:

答案 0 :(得分:2)

这个难题的缺失部分是订阅分发 - 这是跟踪消费者注册什么消息并路由消息的组件。

正如docs所说:

  

在本地总线上创建订阅后,就会显示此信息   需要在您的所有不同总线实例之间共享   应用网络。

     

虽然路由数据是相同的,但这些信息如何传达给所有人   根据您的传输配置,节点的数量会有所不同。

随着页面继续解释,对于MSMQ,您有两个选择:

  1. MSMQ Multicast
  2. UseSubscriptionService(MassTransit.RuntimeServices)
  3. 多播是only really meant for development and not for production。请注意,没有永久订阅和messages can be lost during startup

    订阅服务(又名MassTransit.RuntimeServices)为not distributed with NuGet,因此您需要从源代码中查找二进制文件或编译。它作为Windows服务运行,需要一个数据库来跟踪订阅。

    我相信在运行RabbitMQ或Azure服务总线时不需要这些,这是即将推出的3.0版本支持的传输(在最新版本的2.x中支持Rabbit MQ比MSMQ更多,而且版本3支持MSMQ支持)