MassTransit无法从Azure Service Bus拉取消息问题求助
问题描述
我搭建了MassTransit的消息发布者与消费者,两者的注册代码如下:
发布者注册代码
services.AddMassTransit(x => { x.SetKebabCaseEndpointNameFormatter(); x.UsingAzureServiceBus((context, cfg) => { cfg.Host(configInstance.AzureServiceBusSettings.Connectionstring); cfg.AutoStart = true; }); });
消费者注册代码
services.AddMassTransit(x => { x.SetKebabCaseEndpointNameFormatter(); var entryAssembly = Assembly.GetEntryAssembly(); x.AddConsumers(entryAssembly); x.AddSagaStateMachines(entryAssembly); x.AddSagas(entryAssembly); x.AddActivities(entryAssembly); x.UsingAzureServiceBus((context, cfg) => { cfg.Host(configuration.AzureServiceBusSettings.Connectionstring); cfg.ConfigureEndpoints(context); }); });
启动两个项目后,ServiceBus中已成功创建订阅和名为hello的队列,消费者日志显示端点就绪:
[21:53:35 DBG] Create queue: hello [21:53:40 DBG] Queue: hello (dead letter) [21:53:44 DBG] Endpoint Ready: sb://xxxx.servicebus.windows.net/hello [21:53:44 INF] Bus started: sb://xxx.servicebus.windows.net/
消费者代码如下:
public class HelloConsumer : IConsumer<Hello> { ILogger<HelloConsumer> _logger; public HelloConsumer(ILogger<HelloConsumer> logger) { this._logger = logger; } public Task Consume(ConsumeContext<Hello> context) { this._logger.LogInformation("HEllo"); return Task.CompletedTask; } }
目前消息已发送至hello队列(队列中有7条消息),但消费者始终无法从Azure Service Bus拉取消息,消费者日志无相关消费记录。尝试删除主题和队列时会出现多个404错误。使用的NuGet版本为MassTransit.Azure.ServiceBus.Core 8.0.16,ServiceBus为标准计划,请问是否遗漏了配置步骤?
解决方案
1. 确保消息类型完全一致
MassTransit依赖**消息类型的完全限定名(命名空间+类名)**进行消息匹配。如果发布端与消费端的Hello类命名空间不同、属性结构不一致,消费者会自动忽略队列中的消息。
- 解决方式:将
Hello消息类提取到独立的共享类库,让发布端和消费端引用同一个库,保证类型完全一致。
2. 排查消息序列化与接收问题
在消费者的Consume方法中添加更详细的日志,确认是否接收到消息(同时确保日志级别设置为Information,避免日志被过滤):
public Task Consume(ConsumeContext<Hello> context) { _logger.LogInformation("Received message ID: {Id}, Message content: {@Message}", context.MessageId, context.Message); return Task.CompletedTask; }
另外,检查Azure Portal中hello队列的死信队列,若消息存在死信,说明消息处理过程中出现了序列化或其他错误。
3. 优化MassTransit配置
发布端配置
如果是直接发送消息到队列,显式指定发送目标队列名,避免命名规则不匹配:
services.AddMassTransit(x => { x.SetKebabCaseEndpointNameFormatter(); x.UsingAzureServiceBus((context, cfg) => { cfg.Host(configInstance.AzureServiceBusSettings.Connectionstring); cfg.AutoStart = true; // 显式指定Hello消息发送到hello队列 cfg.Send<Hello>(s => s.UseQueueName("hello")); }); });
消费端配置
可以显式绑定消费者与队列,替代自动配置端点,确保关联关系明确:
services.AddMassTransit(x => { x.SetKebabCaseEndpointNameFormatter(); var entryAssembly = Assembly.GetEntryAssembly(); x.AddConsumers(entryAssembly); x.AddSagaStateMachines(entryAssembly); x.AddSagas(entryAssembly); x.AddActivities(entryAssembly); x.UsingAzureServiceBus((context, cfg) => { cfg.Host(configuration.AzureServiceBusSettings.Connectionstring); // 直接配置hello队列与HelloConsumer的绑定 cfg.ReceiveEndpoint("hello", e => { e.ConfigureConsumer<HelloConsumer>(context); }); }); });
4. 解决删除资源时的404错误
删除主题/队列时出现404,是因为活跃的客户端连接(运行中的发布/消费服务)占用了资源。解决步骤:
- 停止所有关联的服务实例。
- 等待5-10分钟,让Azure Service Bus释放闲置连接。
- 重新尝试删除资源。
内容的提问来源于stack exchange,提问作者Sascha
相关产品推荐
相关产品推荐

