Maksym Strukov
Maksym Strukov

Reputation: 2689

MassTransit MessageRequestClient timeout issue

We have two services which exchange messages via MassTransit on top of RabbitMQ. The goal is to send a message in a request/response way. Here's the code of the service which listens for a message, let's call it 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);
            });
        });
    });

The code of the service which sends a message and process the result, let's call it 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;

When I run the above code I can see Service1 gets a request and calls context.Respond(response); but on the Service2 side I always get a Timeout exception. Since, a message can make it from Service2 to Service1 I assume there are no network related issues. The timeout is pretty high as well. The message processing on Service1 end takes less than a second. So I think a response message is just not routed properly and I don't understand why. What is suspicious to me is that SourceAddress and ResponseAddress contain auto generated values and not "CUSTOM_QUEUE_NAME?durable=false&autodelete=true&exclusive=false". Any ideas what I'm doing wrong?

Upvotes: 2

Views: 1701

Answers (1)

VladOhotnikov
VladOhotnikov

Reputation: 1188

You should start Bus, on your service start, like it shown here

await busControl.StartAsync(source.Token);

Upvotes: 1

Related Questions