【问题标题】:Why is MassTransit only consuming messages on one single thread为什么 MassTransit 只在一个线程上使用消息
【发布时间】:2016-10-07 14:49:04
【问题描述】:

我在常规控制台应用程序中有以下简单代码,并且希望(某些)命令可以并行使用。我认为UseConcurrencyLimit 会设置并发线程的数量。我看到的是 RabbitMQ 确实有 10 条未确认的消息,但是消费者连续消费它们,每个 console.writeline 之间有一秒钟的暂停。我一定遗漏了一些明显的东西,但我不明白。

public static class EventHandler
{
    public static void Run()
    {
        var personQueueName = "RabbitMqPoc.Person";

        var busControl = Bus.Factory.CreateUsingRabbitMq(cfg =>
        {

            cfg.UseConcurrencyLimit(10);

            var host = cfg.Host(new Uri("rabbitmq://localhost"), h =>
            {
                h.Username("guest");
                h.Password("guest");
            });

            cfg.ReceiveEndpoint(host, personQueueName, e =>
            {
                e.UseConcurrencyLimit(10);
                e.PrefetchCount = 10;
                e.Consumer<PersonConsumer>();
            });
        });

        var personSendEndpoint = busControl.GetSendEndpoint(new Uri($"rabbitmq://localhost/{personQueueName}")).Result;

        busControl.Start();

        foreach (var x in Enumerable.Range(1, 20))
        {
            personSendEndpoint.Send(new PersonUpdated() { Name = "Mina Ives", Key = Guid.NewGuid() });
        }

        Console.ReadLine();
        busControl.Stop();
    }
}

internal class PersonConsumer : IConsumer<IPersonUpdated>
{
    public async Task Consume(ConsumeContext<IPersonUpdated> context)
    {
        Thread.Sleep(1000);
        Console.WriteLine($"Updated {context.Message.Name}");
    }

}

【问题讨论】:

    标签: rabbitmq masstransit


    【解决方案1】:

    Thread.Sleep(1000); 更改为await Task.Delay(1000); 可以解决您遇到的问题。

    Thread.Sleep 出于某种原因对 TPL 造成严重破坏。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-11-18
      • 2019-09-26
      • 1970-01-01
      • 2014-03-21
      • 1970-01-01
      • 1970-01-01
      • 2014-01-11
      • 1970-01-01
      相关资源
      最近更新 更多