公共交通:没有消费者

时间:2015-11-10 15:03:47

标签: .net masstransit

有关于Mass Transit ESB的新手问题

我第一次尝试使用MassTransit并尝试了解如何创建队列以及如何使用消息。

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

这是我的初始化代码。

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

           });

然后从网络应用程序中调用以下代码。

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

                pubr.Wait();

            }

这导致Rabbit MQ中的消息丢失。

如果我在控制台应用程序中添加一个使用者,我可以使样本生效。

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

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

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

在我对MassTransit / Rabbit MQ如何工作的理解中,我似乎缺少一些非常基础的东西。我认为这是一个非常常见的场景,即消费者注册发生的时间晚于发布事件,并且消费者将被发送一旦连接就已经发布的所有项目。

1 个答案:

答案 0 :(得分:7)

RabbitMQ由交换和队列组成。

根据邮件类型发布邮件时,MassTransit会创建交换。发布不会创建任何队列。队列是存储消息以传递给消费者的地方。

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

在启动接收端点以及在RabbitMQ中配置其拓扑(交换交换队列绑定)之前,由于没有绑定到任何队列,因此不会传递任何已发布的消息。启动接收端点后,将存在这些绑定,并将消息传递到队列。