MassTransit Respond попадает в ту же очередь и вызывает цикл

В настоящее время мы заменяем NServiceBus на MassTransit, и у меня возникли небольшие трудности с шаблоном запроса / ответа.

В NServiceBus я могу ответить в Handler, и он возвращается к клиенту, который его отправил.

В MassTransit кажется, что ответ отправляется обратно в очередь, из которой он был получен, создавая таким образом цикл ...

Странно, но если я создаю шину с помощью InMemory, а клиент и потребитель находятся на одном компьютере, у меня нет проблемы.

Я ожидаю, что мой клиент поймает ответ, но вместо этого мой Consumer забирает его, что тоже странно, поскольку он не настроен на получение этого типа сообщения ...

Мне что-то не хватает в настройке запроса клиента?

Клиент:

....
IRequestClient<IWorklistRequest, IWorklistResponse> client = CreateRequestClient(busControl, WorklistEndpointUri);

Console.Write("Sending Request");

Task.Run(async () =>
{
    IWorklistRequest request = new WorklistRequest
    {
        CurrentDateFrom = new DateTime(2016, 11, 07)
    };

    var response = await client.Request(request);

    Console.WriteLine("Worklist Items retrieved: {0}", response.ExamItemList.Length);

}).Wait();
....



static IRequestClient<IWorklistRequest, IWorklistResponse> CreateRequestClient(IBusControl busControl, string endpointAddress)
{
    Console.WriteLine("Creating Request client...");

    var serviceAddress = new Uri(endpointAddress);
    IRequestClient<IWorklistRequest, IWorklistResponse> client =
    busControl.CreateRequestClient<IWorklistRequest, IWorklistResponse>(serviceAddress, TimeSpan.FromSeconds(10));

    return client;
}

Потребитель:

    public Task Consume(ConsumeContext<IWorklistRequest> context)
    {
        _log.InfoFormat("Received Worklist Request with Id: {0}", context.RequestId);


        try
        {
            var result = _provider.GetAllWorklistsByStartDate(context.Message.CurrentDateFrom);

            IWorklistResponse response = new WorklistResponse
            {
                ExamItemList = result.ToArray()
            };

            // the below is sending the response right back to the original queue and is getting picked up again by this same consumer
            context.Respond(response);
        }
        catch (Exception ex)
        {
            _log.Info(ex.Message);
        }

        return Task.FromResult(0);
    }

person ragerory    schedule 02.12.2016    source источник


Ответы (1)


Если вы используете RabbitMQ и используете клиент запроса, вы не должны видеть этого поведения.

Вот пример, демонстрирующий, как использовать клиент запросов в репозитории MassTransit GitHub: https://github.com/MassTransit/Sample-RequestResponse

Приведенный выше код кажется правильным, и вызов Respond() должен использовать адрес ответа из сообщения запроса, которое является прямой отправкой конечной точки на временный адрес шины.

В этой области существует довольно обширное покрытие модульными тестами, и приведенный выше образец был обновлен и проверен с помощью последней версии MassTransit. Вы можете подумать об удалении / воссоздании виртуального хоста RabbitMQ и запуске приложения с нуля (сначала запустите службу ответа, чтобы были настроены конечные точки).

person Chris Patterson    schedule 02.12.2016
comment
Да, это образец, с которым я действительно работал, чтобы помочь мне с реализацией ... Я посмотрю, может ли воссоздание хоста RabbitMq исправить это, это уже существующий, который я использовал с NServiceBus. - person ragerory; 02.12.2016
comment
Удален и воссоздан хост RabbitMQ, проблема все еще сохраняется. Он говорит, что не может найти конечную точку ответа. Когда и клиент, и шина находятся на одном компьютере, это не проблема. - person ragerory; 05.12.2016
comment
Обе службы подключаются к RabbitMQ по одному и тому же адресу? Или один из них использует другой адрес хоста? Например, один использует локальный хост, а другой - сетевое имя? Кроме того, не используйте гостевую учетную запись удаленно с RabbitMQ. - person Chris Patterson; 06.12.2016
comment
Да, получатель использует localhost, а клиент использует IP. Я не использую гостевую учетную запись. - person ragerory; 06.12.2016
comment
Оба должны использовать IP, вы не можете смешивать адреса. Локальный хост не может быть разрешен на другом конце. - person Chris Patterson; 06.12.2016
comment
Чувак, спасибо тебе большое. Я знал, что это должно быть что-то незначительное. - person ragerory; 06.12.2016