MassTransit总线启动后设置接收端点时如何配置AutoDelete属性
MassTransit动态接收端点设置自动删除队列解决方案
该需求可以直接实现。
ConnectReceiveEndpoint 动态创建接收端点的配置委托和启动时静态定义接收端点的配置参数完全一致,直接在委托中添加AutoDelete = true配置即可,修改后代码如下:
protected override async Task ExecuteAsync(CancellationToken stoppingToken) { var queueName = _settings.RabbitMq.ServicePrefixQueueName + "-" + _settings.ServiceId; var messageHandler = _busControl.ConnectReceiveEndpoint(queueName, x => { x.Consumer<MessageConsumer>(_serviceProvider); // 开启队列自动删除 x.AutoDelete = true; // 可选兜底配置:队列1分钟无消费者连接时自动删除,应对异常退出场景 x.SetQueueArgument("x-expires", 60 * 1000); }); await messageHandler.Ready; _workerWitness.IsWorkerReady = true; // 绑定服务停止令牌,服务退出时主动关闭接收端点,触发队列删除 stoppingToken.Register(async () => { if (messageHandler.IsStarted) { await messageHandler.StopAsync(CancellationToken.None); } }); }
补充说明
- AutoDelete队列的原生规则是:最后一个连接该队列的消费者断开后,RabbitMQ会自动删除队列以及绑定的专属交换机。
- 如果你不需要动态创建接收端点,原来的静态注册方式也可以解决ServiceProvider注入问题,不需要手动调用
BuildServiceProvider,直接用MassTransit注册时传入的容器provider即可,示例如下:
services.AddMassTransit(x => { x.AddConsumer<MessageConsumer>(); 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); config.ReceiveEndpoint(queueName, e => { // 直接用provider从容器获取消费者,无需手动实例化 e.Consumer<MessageConsumer>(provider); e.AutoDelete = true; }); })); });
内容的提问来源于stack exchange,提问作者jopa
相关产品推荐
相关产品推荐

