使用CreateRequestClient方法时,启动MassTransit总线的正确方法是什么?

时间:2018-12-12 12:52:21

标签: 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方法之前,启动总线的正确方法是什么?还是后一种启动总线的方法足够了吗?

0 个答案:

没有答案