В настоящее время мы заменяем 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);
}