如何知道队列是否为空,并且没有更多消息可以使用MassTransit 3.0读取

时间:2016-11-25 17:20:44

标签: c# c#-4.0 rabbitmq masstransit

我正在使用带有RabbitMq的MassTransit 3.0。我想知道我的队列是否为空,因为我需要从db中删除临时表,如果是的话。我无法弄清楚如何查看队列是否为空。

var inventoryBus = new InventoryBus(new RabbitServiceConfig());
inventoryBus.Instance.Start();
inventoryBus.Instance.ConnectConsumer<InventoryConsumer>();

==========消费者===============

public class InventoryConsumer: IConsumer<IAvailableStockChanged>
{
    private readonly IInventoryService _service;
    public InventoryConsumer() {

    }
    public InventoryConsumer(IInventoryService service) {
        _service = service;
    }

    public async Task Consume(ConsumeContext<IAvailableStockChanged> context) {
        await Console.Out.WriteLineAsync("Message received....." + context.Message.Sku);
        //_service.AddOrUpdate(context.Message);
    }
}

此外,当我在读取每条消息后执行Db操作时,我想停止消费者,以便我不读取任何待处理的消息。

任何帮助将不胜感激......

1 个答案:

答案 0 :(得分:1)

该链接为您提供了检查队列中消息的API,如上所示。

但是,我想指出您设置公交车并连接消费者的方法将会给您带来麻烦。

请查看有关如何在特定队列中注册使用者的文档:

http://docs.masstransit-project.com/en/latest/usage/consumer.html#connecting-a-message-consumer

此外,如果要一次处理一条消息,可以将预取计数设置为1(并使用并发限制过滤器,如果它太慢)。

e.PrefetchCount = 1;

并发限制过滤器除上述内容外还可以使用。

e.PrefetchCount = 20; // in case your messages are small and fast
e.UseConcurrencyLimit(1); // sets one at a time message handling

使用并发限制时,您可能还想设置重试策略。

e.UseRetry(x => x.Interval(10, 500)); // retry 10 times every 500ms