我有两个托管服务,每个服务都使用自己的rabbit mq地址,如您所见:
{
"RabbitMQOptions": {
"HostName": "172.23.131.1",
"VirtualHost": "/",
"Port": 5672,
"Username": "**",
"Password": "***!"
},
"RabbitMQOptions1": {
"HostName": "172.23.39.1",
"VirtualHost": "***",
"Port": 5672,
"Username": "***",
"Password": "123456"
}
}
我有两个名为N4和Fund的托管服务,它们每个都需要自己的rabbitmq配置这是我的员工的代码:
public class N2Worker : BackgroundService
{
private readonly string QUEUE_CONSUMER_NAME;
private readonly IRabbitMQConsumer _rabbitMQConsumer;
public N2Worker(
IRabbitMQConsumer rabbitMQConsumer,
IConfiguration configuration)
{
_rabbitMQConsumer = rabbitMQConsumer;
}
}
所以在我的程序.cs中,我添加了这个:
IHost host = Host.CreateDefaultBuilder(args)
.ConfigureServices((hostContext, services) =>
{
services.AddRabbitMQ(hostContext.Configuration);
services.AddHostedService<N2Worker>();
services.AddHostedService<FundWorker>();
})
.Build();
await host.RunAsync();
所以在AddRabbitMQ
中,我有这个:
public static IServiceCollection AddRabbitMQ(
this IServiceCollection services, IConfiguration configuration)
{
services.Configure<RabbitMQOptions>(configuration.GetSection(
RabbitMQOptions.DefaultSectionName));
services.AddSingleton<RabbitMqService>();
return services;
}
我的rabbitService
类是:
public sealed class RabbitMqService
{
private readonly RabbitMQOptions _configuration;
public RabbitMqService(IOptions<RabbitMQOptions> options)
{
_configuration = options.Value;
}
public IConnection CreateConnection()
{
var connection = new ConnectionFactory()
{
HostName = _configuration.HostName,
Port = _configuration.Port,
VirtualHost= _configuration.VirtualHost,
UserName = _configuration.Username,
Password = _configuration.Password,
DispatchConsumersAsync = true
};
return connection.CreateConnection();
}
}
正如你在AppSetting
中看到的那样,我有不同的地址,我的问题是如何注册两个不同配置的RabbitMQ实例?
这是我的消费者的代码:
public sealed class RabbitMQConsumer : IRabbitMQConsumer, IDisposable
{
private IModel _channel;
private IConnection _connection;
private readonly RabbitMqService _rabbitMqService;
public RabbitMQConsumer(RabbitMqService rabbitMqService)
{
_rabbitMqService = rabbitMqService;
}
}
我想把rabbitConsumer注入到每个不同配置的工作中,我的意思是N4使用RabbitMQOptions,基金使用Rabbit MQOptions1
您的配置名称中不能有两个具有相同名称的部分,因此您必须对它们进行不同的命名,例如:
"RabbitMQOptions1": { ... },
"RabbitMQOptions2": { ... }
接下来,您必须分别注册这两个服务,同时加载它们各自的配置,例如:
var options1 = Configuration.GetSection("RabbitMQOptions1").Get<RabbitMQOptions>();
services.AddSingleton<RabbitMqService>(_ => new RabbitMqService(options1));
var options2 = Configuration.GetSection("RabbitMQOptions2").Get<RabbitMQOptions>();
services.AddSingleton<RabbitMqService>(_ => new RabbitMqService(options2));
最后,由于RabbitMqService
现在依赖于RabbitMQOptions
而不是IOptions<RabbitMQOptions>
,因此需要更改其构造函数:
public sealed class RabbitMqService
{
private readonly RabbitMQOptions _configuration;
public RabbitMqService(RabbitMQOptions options)
{
_configuration = options;
}
...
}