【问题标题】:Mass Transit : No consumer大众运输:没有消费者
【发布时间】:2015-11-10 15:03:46
【问题描述】:

有关于 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 的工作原理时缺少一些非常基本的东西。我会认为这是一个非常常见的场景,即消费者注册发生在发布事件之后,并且一旦连接,消费者将收到所有已发布的项目。

【问题讨论】:

    标签: .net masstransit


    【解决方案1】:

    RabbitMQ 由交换和队列组成。

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

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

    直到接收端点启动,并且它们的拓扑在 RabbitMQ 中配置(交换交换队列绑定),任何发布的消息都不会被传递,因为没有绑定到任何队列。一旦接收端点启动,这些绑定就存在并且消息将被传递到队列。

    【讨论】:

      猜你喜欢
      • 2012-12-08
      • 2021-08-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-20
      • 1970-01-01
      • 2018-08-30
      • 1970-01-01
      相关资源
      最近更新 更多