【问题标题】:RequestTimeoutException in Request/Response scenario请求/响应场景中的 RequestTimeoutException
【发布时间】:2018-01-08 11:11:46
【问题描述】:

尝试使用 MassTransit.RabbitMQ 版本 4.0.1.1378-develop、一个 ASP.NET Core 2 Web 应用程序和一个 .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&lt;SubmitOrder, OrderSubmitResult&gt;,我发送请求如下:

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&lt;IBusControl&gt;(bus);,然后将Startup.csConfigure方法更改为以下:

public void Configure(IApplicationBuilder app, IHostingEnvironment env, IApplicationLifetime applicationLifetime, IBusControl bus)
{
    applicationLifetime.ApplicationStopping.Register(() => bus.Stop(TimeSpan.FromSeconds(10)));
....

处理正常关机。

【问题讨论】:

  • 你在 WebApplication 中的总线上调用Start 吗?

标签: rabbitmq .net-core masstransit request-response


【解决方案1】:

我已经构建了一个示例来展示如何正确执行此操作,包括使用 ASP.NET Core 2、Web 应用程序和控制台应用程序。

https://github.com/MassTransit/Sample-DotNetCore-Request

享受吧!

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-09-10
  • 1970-01-01
  • 1970-01-01
  • 2014-06-14
  • 2021-01-14
  • 2018-03-02
  • 1970-01-01
相关资源
最近更新 更多