如何解决在总线启动后设置接收端点后设置 AutoDelete
我在 net core 3.1 中使用 masstransit/rabbitmq。我有一个调度程序服务,它会在可用时向工作服务发送消息。每个 worker 服务前面都有一个 rabbitmq 队列,该队列是在服务启动时创建的。我想确保当工作服务停止时,需要删除队列(和交换)。当我在配置 (Program.cs) 中设置标志 AutoDelete 时,我已经能够让它工作:
services.AddMassTransit(x =>
{
x.AddBus(provider => Bus.Factory.CreateUsingRabbitMq(config =>
{
config.Host(settings.RabbitMq.Host,settings.RabbitMq.Port,settings.RabbitMq.VirtualHost,h =>
{
h.Username(settings.RabbitMq.Username);
h.Password(settings.RabbitMq.Password);
});
var queueName = AssembleQueueName(settings);
var sp = services.BuildServiceProvider();
config.ReceiveEndpoint(queueName,e =>
{
e.Consumer(() => new MessageConsumer());
e.AutoDelete = true;
});
}));
});
不幸的是,这对我不起作用,因为我需要在我的消费者类中有 ServiceProvider,因此我正在执行以下操作 (Worker.cs):
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
var queueName = _settings.RabbitMq.ServicePrefixQueueName + "-" + _settings.ServiceId;
var messageHandler = _busControl.ConnectReceiveEndpoint(queueName,x =>
{
x.Consumer<MessageConsumer>(_serviceProvider);
});
await messageHandler.Ready;
_workerWitness.IsWorkerReady = true;
}
但在这里我不知道如何设置 AutoDelete 标志。甚至有可能吗?
解决方法
如果您follow the documentation,在使用容器配置使用者时,您会看到您可以配置您的使用者,以便从容器中解析它们,如下所示(您的代码,已更新为正确):>
services.AddMassTransit(x =>
{
x.AddConsumer<MessageConsumer>();
x.UsingRabbitMq((context,config) =>
{
config.Host(settings.RabbitMq.Host,settings.RabbitMq.Port,settings.RabbitMq.VirtualHost,h =>
{
h.Username(settings.RabbitMq.Username);
h.Password(settings.RabbitMq.Password);
});
var queueName = AssembleQueueName(settings);
config.ReceiveEndpoint(queueName,e =>
{
e.AutoDelete = true;
e.ConfigureConsumer<MessageConsumer>(context);
});
}));
});
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。