2015-11-10 100 views
1

有关于地下ESB轨道交通:没有消费者

我想MassTransit首次,并试图让我的头围绕如何创建队列和消息是如何消费的新手问题。

我有一个Web应用程序和控制台应用程序试图做发布/分别

这是我的初始化代码消耗。

var bus = Bus.Factory.CreateUsingRabbitMq(sbc => 
      { 
       var host = sbc.Host(new Uri(hostName), h => 
       { 
        h.Username(userName); 
        h.Password(password); 
       }); 

      }); 

然后从web应用程序调用以下代码。

using (Bus.Start()) 
      { 
       var pubr = Bus.Publish<T>(message); 

       pubr.Wait(); 

      } 

这会导致消息在Rabbit MQ中丢失。

如果我在控制台应用程序中添加使用者,我可以使示例工作。

sbc.ReceiveEndpoint(host, 
        e => 
         e.Consumer<LoginEventConsumer>(d => { }) 
       { } 

我的问题是为什么我的消息如果没有消费者会丢失?

它看起来像兔子MQ认为没有队列连接到交易所,因此消息丢失。那是对的吗 ?有没有办法在初始化期间创建队列和交换,而不会混淆具有大量随机命名队列/交换的Rabbit MQ?

看起来像我缺少一些非常基本的东西,我理解MassTransit/Rabbit MQ的工作原理。我认为这是一种非常普遍的情况,即消费者注册发生在发布事件后的较晚时间点,并且消费者在连接后将发送所有已发布的项目。

回答

5

RabbitMQ由交换和队列组成。

交换是基于消息类型发布消息时由MassTransit创建的。发布不会创建任何队列。队列是存储消息以传递给消费者的地方。

将接收端点添加到总线时创建队列。对于消费者,处理程序和sagas添加到接收端点,创建和绑定交换,以便发布到交换的消息由接收端点(通过队列)接收。

直到接收端点启动,并且在RabbitMQ(exchange-exchange-queue绑定)中配置了它们的拓扑结构后,由于没有绑定到任何队列,所以发布的任何消息都不会被发送。一旦接收端点启动,那些绑定就存在,消息将被传送到队列中。

相关问题