RequestTimeoutException в сценарии запроса / ответа
Попытка реализовать сценарий запроса / ответа с MassTransit.RabbitMQ
версия 4.0.1.1378-develop
веб-приложение ASP.NET Core 2 и консольный проект.NET Core 2.
Ниже приведен код, который создает клиент шины и запроса в моем приложении ASP.NET Core 2.0:
var bus = Bus.Factory.CreateUsingRabbitMq(sbc =>
sbc.Host(new Uri("rabbitmq://localhost"), h =>
{
h.Username("guest");
h.Password("guest");
})
);
services.AddSingleton<IPublishEndpoint>(bus);
services.AddSingleton<IBusControl>(bus);
var requestTimeout = TimeSpan.FromSeconds(10);
var address = new Uri("rabbitmq://localhost/myqueue");
services.AddScoped<IRequestClient<SubmitOrder, OrderSubmitResult>>(ctx => new MessageRequestClient<SubmitOrder, OrderSubmitResult>(bus, address, requestTimeout));
Затем с помощью IRequestClient<SubmitOrder, OrderSubmitResult>
это было введено в мой контроллер, я отправляю запрос, как показано ниже:
private readonly IRequestClient<SubmitOrder, OrderSubmitResult> _client;
public async Task<ActionResult> SendRequest(string id)
{
var result = await _client.Request(new SubmitOrder());
...
}
Наконец, способы, которыми я пытался отправить ответ клиенту:
var bus = Bus.Factory.CreateUsingRabbitMq(cfg =>
{
var host = cfg.Host(new Uri("rabbitmq://localhost"), h =>
{
h.Username("guest");
h.Password("guest");
});
cfg.ReceiveEndpoint(host, "myqueue", ep =>
{
ep.Handler<SubmitOrder>(context => context.RespondAsync(new OrderSubmitResult()));
// async version
//ep.Handler<SubmitOrder>(async context =>
//{
// await context.RespondAsync(new OrderSubmitResult());
//});
// with a Consumer
//ep.Consumer<SubmitOrderConsumer>();
// with a single Consumer
//ep.Instance(new SubmitOrderConsumer());
});
});
bus.Start();
Я получаю запрос в моем автобусе и отправляю соответствующий ответ. Но я всегда получаю RequestTimeoutException
на стороне клиента и ни один из вышеперечисленных подходов не сработал.
Обновить:
Код в порядке. Я забыл завести автобус (bus.start
) на стороне клиента: /
@Chris: Спасибо за добавление полного рабочего образца за короткое время. Я предлагаю добавить services.AddSingleton<IBusControl>(bus);
а затем изменить Startup.cs
"s Configure
метод ниже:
public void Configure(IApplicationBuilder app, IHostingEnvironment env, IApplicationLifetime applicationLifetime, IBusControl bus)
{
applicationLifetime.ApplicationStopping.Register(() => bus.Stop(TimeSpan.FromSeconds(10)));
....
Чтобы справиться с грациозным отключением.
1 ответ
Я построил пример, чтобы показать, как это сделать правильно, включая использование ASP.NET Core 2, как веб-приложения, так и консольного приложения.
https://github.com/MassTransit/Sample-DotNetCore-Request
Наслаждайтесь!