masstransit - 使用 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
?或者后一种启动总线的方法是否足够?
解决方案
推荐阅读
- google-apps-script - 创建一个扫描应用程序以发送到工作表以跟上每天的出勤率,并在创建后完成所有这些操作而无需我弄乱它
- python - 有什么方法可以组合 2 个熊猫数据框吗?
- python - 在 python 中,是否有理由将 self 传递给类中的静态方法?
- php - codeigniter 问题,我不知道我的 MVC 出了什么问题
- javascript - FullCalendar 4,在重新获取之前清除事件
- javascript - 按日期排序对象数组无法正常工作,忽略年份值
- python - 带有 Django Python 的水晶报表
- python - 为什么 np.dot 不精确?(n 维数组)
- android - 为什么 assembleDebug 成功但 assembleRelease 在本机反应中失败?
- python - 使用 datetime.strptime 时如何不显示年月日?