MassTransit:如何在Fault<T>消费上下文获取MT-*头部及消费者名称?
问题描述
我尝试用Fault Consumer处理额外信息,但Fault Consumer的ConsumeContext<Fault<TestDto>>上下文无法获取到RabbitMQ管理工具中错误队列消息里的MT-*头部(仅启用重试时能看到MT-Fault-RetryCount)。我期望获取MT-Fault-Message等所有MT-*头部,虽能从context.Message.Exceptions获取故障详情,但希望获取消费者名称。请问是否有其他方法获取消费者名称,或是我操作有误?
相关代码
FaultConsumer
public async Task Consume(ConsumeContext<Fault<TestDto>> context) { try { var producingService = context.Message.Host.ProcessName; var consumerName = context.Headers.Get<string>("MT-Fault-ConsumerType", "Unknown"); } }
Consumer
public async Task Consume(ConsumeContext<TestDto> context) { throw new Exception("Test"); }
解决方法
检查Fault配置完整性
确保消费者注册时已正确启用Fault特性并配置错误队列路由,示例配置如下:services.AddMassTransit(cfg => { cfg.AddConsumer<TestConsumer>() .Endpoint(e => { e.FaultAddress = new Uri("queue:test-faults"); }); cfg.AddConsumer<FaultConsumer>(); });正确的配置才能保证Fault消息携带完整的头部信息。
主动添加自定义消费者标识
在原始消费者中,抛出异常前主动将消费者名称写入消息头部,Fault Consumer即可直接读取:public async Task Consume(ConsumeContext<TestDto> context) { // 添加自定义头部标识消费者 context.Headers.Set("ConsumerName", typeof(TestConsumer).FullName); throw new Exception("Test"); }之后在Fault Consumer中通过
context.Headers.Get<string>("ConsumerName")获取该值。获取RabbitMQ原始消息属性
直接通过ConsumeContext获取RabbitMQ的原始消息属性,从中读取MT-*头部:public async Task Consume(ConsumeContext<Fault<TestDto>> context) { var basicProperties = context.GetPayload<IBasicProperties>(); if (basicProperties.Headers.TryGetValue("MT-Fault-ConsumerType", out var value)) { var consumerName = value.ToString(); } }升级MassTransit版本
部分旧版本MassTransit存在Fault头部传递的bug,升级到最新稳定版可解决这类问题。
内容的提问来源于stack exchange,提问作者Melvin DVaz
相关产品推荐
相关产品推荐

