MassTransit:消费者使用完所有消息后,如何停止总线?

时间:2019-05-08 07:52:23

标签: masstransit

在使用MassTransit消耗队列中的所有消息之后,我尝试停止总线。我将并发消息限制设置为1,因为我的使用者需要一次处理一条消息。

我尝试将bus.StopAsync()放在bus.StartAsync后面,如下所示。结果表明,在消耗了一条消息之后,总线将停止。

总线配置:

IBusControl bus = Bus.Factory.CreateUsingRabbitMq(cfg =>
            {
                IRabbitMqHost host = cfg.Host(new Uri("rabbitmq://localhost"), hostConfigurator =>
                {
                    hostConfigurator.Username("username");
                    hostConfigurator.Password("password");
                });

            cfg.ReceiveEndpoint(host, "MyResult", ep =>
            {
                ep.Bind("MyExchange", s => { s.Durable = true; });

                ep.Consumer<MessageConsumer>(mc =>
                {
                    mc.UseConcurrentMessageLimit(1);
                });
            });
        });

公交起停:

await bus.StartAsync();

await bus.StopAsync();

我的问题是队列中的所有消息都用完后如何停止总线。我对MassTransit相当陌生,并且真的对调用消费者和停止公交的顺序感到好奇。感谢有人可以帮忙。谢谢。

1 个答案:

答案 0 :(得分:0)

在“测试”名称空间中,有一个功能可用来监视总线上的活动,该功能可用于发出信号,表明没有消息被占用(此后,您可以按照建议的方式停止总线)。

您可以看到单元测试: https://github.com/MassTransit/MassTransit/blob/develop/src/MassTransit.Tests/BusActivityMonitor_Specs.cs#L69

使用以下方式添加观察者:

var activityMonitor = bus.CreateBusActivityMonitor(TimeSpan.FromMilliseconds(500));

总线空闲后,超时时间为true:

var timeout = await activityMonitor.AwaitBusInactivity(TimeSpan.FromSeconds(10));

如果timeout为true,则在指定的时间内总线上没有活动。