首页 > 解决方案 > 使用 CreateRequestClient 方法时启动 MassTransit 总线的正确方法是什么?

问题描述

我正在使用以下代码在两个不同的进程之间发送请求/响应消息。

这是“发送”请求的过程:

// configure host
var hostUri = new Uri(configuration["RabbitMQ:Host"]);
services.AddSingleton(provider => Bus.Factory.CreateUsingRabbitMq(cfg =>
{
    var host = cfg.Host(hostUri, h =>
    {
        h.Username(configuration["RabbitMQ:Username"]);
        h.Password(configuration["RabbitMQ:Password"]);
    });
}));

// add request client
services.AddScoped(provider => provider.GetRequiredService<IBus>().CreateRequestClient<QueryUserInRole, QueryUserInRoleResult>(new Uri(hostUri, "focus-authorization"), TimeSpan.FromSeconds(5)));

// add dependencies 
services.AddSingleton<IPublishEndpoint>(provider => provider.GetRequiredService<IBusControl>());
services.AddSingleton<ISendEndpointProvider>(provider => provider.GetRequiredService<IBusControl>());
services.AddSingleton<IBus>(provider => provider.GetRequiredService<IBusControl>());

// add the service class so that the runtime can automatically handle the start and stop of our bus 
services.AddSingleton<Microsoft.Extensions.Hosting.IHostedService, BusService>();

这是 的实现BusService

public class BusService : Microsoft.Extensions.Hosting.IHostedService
{
private readonly IBusControl _busControl;

public BusService(IBusControl busControl)
{
    _busControl = busControl;
}

public Task StartAsync(CancellationToken cancellationToken)
{
    return _busControl.StartAsync(cancellationToken);
}

public Task StopAsync(CancellationToken cancellationToken)
{
    return _busControl.StopAsync(cancellationToken);
}
}

问题是当CreateRequestClient代码运行时,总线还没有启动。因此,消费者永远不会返回响应。

如果我用以下代码替换主机配置,我会得到所需的行为:

var bus = Bus.Factory.CreateUsingRabbitMq(cfg =>
{
    var host = cfg.Host(hostUri, h =>
    {
        h.Username(configuration["RabbitMQ:Username"]);
         h.Password(configuration["RabbitMQ:Password"]);
    });
});
bus.Start();
services.AddSingleton(bus);

出于某种原因,BusService(IHostedService)在代表之后执行AddScoped

我的问题是:在使用该方法之前启动总线的正确方法是什么CreateRequestClient?或者后一种启动总线的方法是否足够?

标签: masstransit

解决方案


推荐阅读