You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 08:17:46