使用MassTransit对接Azure Service Bus如何让消费者获取正确生产者名称
你遇到的这个问题根因为MassTransit在Web应用运行环境下默认的主机名解析逻辑会fallback到固定值「MassTransit」,控制台应用运行时能正常读取系统主机名所以没有这个问题,以下是两种可行解决方案:
方案1:全局配置总线主机头(推荐,改动最小)
直接在创建总线的配置块中显式指定HostHeader属性即可,你可以写死固定生产者名称,也可以读取当前机器名等动态值,修改后的总线创建代码如下:
_busControl = Bus.Factory.CreateUsingAzureServiceBus(conf => { conf.Host(servicebusConnectionstring); // 显式指定生产者名称,可替换为你自定义的标识 conf.HostHeader = Environment.MachineName; });
配置完成后,消费者侧读取原有的主机名字段就能拿到你设置的正确值,不需要修改消费者逻辑。
方案2:自定义消息头传递生产者标识(灵活度最高)
如果需要针对不同消息设置不同的生产者标识,或者怕和MassTransit内置字段冲突,可以自定义消息头传递参数:
生产者侧修改发布逻辑:
var busSendMessages = events .Select(c => busControl.Publish<T>(c, publishContext => { // 自定义头写入生产者标识,键名可自定义 publishContext.Headers.Set("X-Producer-Name", Environment.MachineName); })) .ToList();
消费者侧读取逻辑:
在消费者的Consume方法中从上下文读取自定义头即可:
public async Task Consume(ConsumeContext<T> context) { if (context.Headers.TryGetHeader("X-Producer-Name", out var producerNameObj)) { var producerName = producerNameObj?.ToString(); // 后续记录逻辑 } }
内容的提问来源于stack exchange,提问作者Molay
相关产品推荐
相关产品推荐

