【发布时间】:2019-03-20 13:57:30
【问题描述】:
我们在应用程序中使用 RabbitMQ 和 MassTransit 作为我们的消息传递基础设施。
我有一个场景,我的消费者需要停止处理消息一段时间,然后在稍后重新启动。
我可以成功停止总线并且消费者停止处理进一步的消息,但是当我重新启动总线时它说总线已经启动,但消费者不会再接收任何消息以进行进一步处理
示例代码看起来像
var iBusControl = Bus.Factory.CreateUsingRabbitMq(cfg =>
{
var host = cfg.Host(new Uri("rabbitmq://localhost"), h =>
{
h.Username("guest");
h.Password("guest");
});
if (linkConsumer)
cfg.ReceiveEndpoint("TestMessage_Queue", x =>
{
x.Consumer<TestMessageConsumer>();
});
});
iBusControl.Start();
// Consumer starts processing messages
// later on in the code I call stop on the same bus instance
iBusControl.Stop();
// Consumer stops processing messages
// later on in the code I call start again on the bus instance
iBusControl.Start();
// Masstransit also says, bus already started
// But the consumer won't pick up any further messages for processing.
如果我创建一个与我的代码的第一个块相同的总线的新实例并在其上调用 start,它将正确连接消费者并再次开始消息处理。几个问题/困惑
- 这是预期的行为吗?
- 停止总线是否会删除所有接收端点配置?
- 为什么公交车停了就不能启动了?
将 MassTransit 5.3.3 与 RabbitMQ 3.6.14 Erlang 20.1 结合使用
【问题讨论】:
-
我相信公交车停车后无法启动。需要重新启动应用程序。对我来说,你想要做的是设计气味。必须有其他方法来满足这一要求。
-
如果我们因为下游的依赖关系损坏而无法处理,我们正在尝试做的是停止选择更多消息。我上面给出的例子不是生产设计。
-
您需要使用断路器,重新交付和其他可用方法。所有这些模式都广为人知并得到了恰当的描述。
-
这里不粗鲁,我不是在寻找设计建议。我熟悉这些模式。我的问题是为什么 MassTransit 会以某种方式行事。
-
您无法重新启动已停止的总线实例。您需要重新配置一个新实例并启动它。只需扩展重启循环以包括重新配置,就可以了。
标签: rabbitmq masstransit