MassTransit MessageRequestClient超时问题

时间:2018-03-13 19:30:32

标签: masstransit

我们有两个服务通过RabbitMQ之上的MassTransit交换消息。 目标是以请求/响应方式发送消息。这是收听消息的服务代码,我们称之为 Service1

Bus.Factory.CreateUsingRabbitMq(
    sbc =>
    {
        var host = sbc.Host(new Uri($"rabbitmq://{RabbitMqHost}"), h =>
        {
            h.ConfigureRabbitMq();//Custom extension to specify credentials
        });

        sbc.ReceiveEndpoint(host, "CUSTOM_QUEUE_NAME", ep =>
        {
            ep.Exclusive = false;
            ep.AutoDelete = true;
            ep.Durable = false;
            ep.PrefetchCount = 1;
            ep.Handler<EngineStartingMessage>(async context =>
            {
                //SourceAddress and ResponseAddress are auto generated queues
                //Message processing is done here
                context.Respond(response);
            });
        });
    });

发送消息并处理结果的服务代码,我们称之为 Service2

var requestClient =
        new MessageRequestClient<EngineStartingMessage, EngineStartingResponse>(
                EntityServiceBus,
                new Uri("CUSTOM_QUEUE_NAME?durable=false&autodelete=true&exclusive=false"),
                new TimeSpan(0, 0, 30));

var engineStartResponse = requestClient.Request(new EngineStartingMessage() { Version = SystemVersion }).Result;

当我运行上述代码时,我可以看到 Service1 收到请求并调用context.Respond(response);,但在 Service2 方面,我总是会收到超时异常。因为,消息可以从 Service2 Service1 ,我认为没有与网络相关的问题。超时也非常高。 Service1 结束时的消息处理时间不到一秒。所以我认为响应消息没有正确路由,我不明白为什么。我可疑的是 SourceAddress ResponseAddress 包含自动生成的值,而不是"CUSTOM_QUEUE_NAME?durable=false&autodelete=true&exclusive=false"。我有什么想法吗?

1 个答案:

答案 0 :(得分:1)

您应该在服务启动时启动 Bus,如图所示here

await busControl.StartAsync(source.Token);