【问题标题】:MassTransit Producer takes 60 seconds to Consume an eventMassTransit Producer 需要 60 秒来消费一个事件
【发布时间】:2017-03-23 22:58:46
【问题描述】:

我有 2 个项目:

  1. 名为 Service.Endpoints 的 MassTransit(Topshelf Windows 服务)
  2. 一个试图与之通信的控制台应用客户端称为TestConsole

总体要求如下:

  1. TestConsole 发送 SolveProblemCommand
  2. Service.Endpoints 使用命令并发布ProblemSolvedEvent
  3. TestConsole 消费事件。

问题:

除了第 3 步(TestConsole 使用该事件)仅在事件发布后 60 秒左右发生外,上述所有步骤都可以正常工作。首先显示以下错误(60秒后),然后Consumer收到调用。

Timeout waiting for consumer to exit: rabbitmq://localhost:5672/bus-PC-NAME-TestConsole.vshost-4sboyydjz6ne6mz6bdky1b7ad4?durable=false&autodelete=true&prefetch=16

等待消费者退出超时:rabbitmq://localhost:5672/problemsolved.queue?prefetch=16

代码:

Service.Endpoints.csproj

bus = BusConfigurator.ConfigureBus(new AppSettings(), (cfg, host) =>
{
    cfg.ReceiveEndpoint(host, RabbitMqConstants.SolveProblemQueue, e =>
    {
        e.Consumer<SolveProblemCommandConsumer>(NinjectConfig.CurrentKernel);
    });
});

bus.Start();

class SolveProblemCommandConsumer : IConsumer<SolveProblemCommand>
{
    public async Task Consume(ConsumeContext<SolveProblemCommand> context)
    {
        var controller = new Controller(context.Message.Problem);
        var results = await controller.Start(context.Message.Options);
        await context.Publish(new ProblemSolvedEvent(results));
    }
}

TestConsole.csproj

var bus = BusConfigurator.ConfigureBus(new AppSettings(), (cfg, host) =>
{
    cfg.ReceiveEndpoint(host, RabbitMqConstants.ProblemSolvedQueue, e =>
    {
        e.Consumer<ProblemSolvedEventConsumer>();
    });
});

var sendToUri = new Uri($"{RabbitMqConstants.RabbitMqUri}{RabbitMqConstants.SolveProblemQueue}");
var endpoint = await bus.GetSendEndpoint(sendToUri);
bus.Start();

await endpoint.Send(someMessage);


class ProblemSolvedEventConsumer : IConsumer<ProblemSolvedEvent>
{
    public async Task Consume(ConsumeContext<ProblemSolvedEvent> context)
    {
        ...
    }
}

【问题讨论】:

  • 听起来 60 秒是您在发送第一条消息(命令)时从控制台遇到的超时,您确定您没有同步阻止控制台吗?你还没有分享任何监听代码..
  • 最能帮助我诊断这些问题的是为 RabbitMQ 安装 Web 插件。它将允许您查看交换和队列,以查看您的消息是否实际已发送。如果您看到它排在队列中,那么您就知道您的消费者不正确。
  • @OlegBogdanov 我想我已经分享了所有代码。两个cfg.ReceiveEndpoint() 调用,两个Consumer&lt;T&gt;() 调用和两个IConsumer&lt;T&gt; 类。缺少什么监听代码?
  • @phil 感谢您的提示,我安装了管理插件,可以看到消息在队列中等待 60 秒,然后它突然被预期的消费者正确消费。问题只是60延迟。否则它工作正常。
  • 下一个问题是消息有多大。当我试图在消息中传递一个大文件时,我遇到了类似的情况。

标签: c# rabbitmq microservices masstransit


【解决方案1】:

TestConsole.csproj 项目中,我重用相同的IBusControl 对象来发送命令和使用事件。一旦我创建了两个单独的总线对象,它就会按预期工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-02-23
    • 2020-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多