公共交通:没有消费者
Mass Transit : No consumer
有一个关于公共交通 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 的工作原理时遗漏了一些非常基本的东西。我原以为这是一种非常常见的情况,即消费者注册发生在发布事件之后,并且消费者将在连接后收到所有已发布的项目。
RabbitMQ 由交换器和队列组成。
MassTransit 在发布消息时根据消息类型创建交换。发布不会创建任何队列。队列是存储消息以传递给消费者的地方。
队列是在接收端点添加到总线时创建的。对于添加到接收端点的消费者、处理程序和 sagas,创建并绑定交换器,以便接收端点(通过队列)接收发布到交换器的消息。
在启动接收端点并在 RabbitMQ 中配置它们的拓扑(exchange-exchange-queue 绑定)之前,发布的任何消息都不会传递,因为没有绑定到任何队列。一旦接收端点启动,这些绑定就会存在,消息将被传送到队列。
有一个关于公共交通 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 的工作原理时遗漏了一些非常基本的东西。我原以为这是一种非常常见的情况,即消费者注册发生在发布事件之后,并且消费者将在连接后收到所有已发布的项目。
RabbitMQ 由交换器和队列组成。
MassTransit 在发布消息时根据消息类型创建交换。发布不会创建任何队列。队列是存储消息以传递给消费者的地方。
队列是在接收端点添加到总线时创建的。对于添加到接收端点的消费者、处理程序和 sagas,创建并绑定交换器,以便接收端点(通过队列)接收发布到交换器的消息。
在启动接收端点并在 RabbitMQ 中配置它们的拓扑(exchange-exchange-queue 绑定)之前,发布的任何消息都不会传递,因为没有绑定到任何队列。一旦接收端点启动,这些绑定就会存在,消息将被传送到队列。