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

RawRabbit收发消息异常排查:队列交换机已创建但无消息接收

问题分析与解决方案

嘿,我一眼就瞅到几个可能导致你收不到消息的关键点,咱们一个个来捋清楚:

1. 消息类型不匹配(最核心的问题)

你发布端发送的是BasicMessage类型的消息,但订阅端却在监听SubMsg类型。RawRabbit默认会根据**消息的CLR类型(包括命名空间)**生成路由规则,这俩类型完全不搭,订阅端自然抓不到消息。

解决办法:两端统一用同一个消息类,确保命名空间也一致:

// 两端项目都要引用这个类,命名空间别搞错
public class BasicMessage
{
    public string Message { get; set; }
}

然后把订阅端的SubscribeAsync<SubMsg>改成SubscribeAsync<BasicMessage>。

2. 发布消息的异步操作未等待

你在发布端调用_bus.PublishAsync(...)时没有加await,程序可能在消息还没发送完成时就直接退出了,导致消息根本没投递到RabbitMQ。

修改发布端的Main方法:

// 把Main改成async Task类型
static async Task Main(string[] args) 
{
    string message = "Hello World";
    const string EXCHANGE_NAME = "myRabbit";
    Action<IPublishConfigurationBuilder> publishConfig = (ctx) => 
        ctx.WithExchange(x => x.WithName(EXCHANGE_NAME));
    
    // 用using确保BusClient资源能正确释放
    using var _bus = GetBusClient(); 
    await _bus.PublishAsync(new BasicMessage { Message = message }, Guid.NewGuid(), publishConfig);
    
    Console.WriteLine("消息已发送,稍等片刻确认投递...");
    await Task.Delay(1000); // 给点时间让消息完成投递
}

3. 交换机与队列的绑定规则缺失

虽然你指定了交换机和队列,但没有明确配置两者之间的绑定关系。RawRabbit需要知道怎么把交换机的消息路由到队列,你可以在订阅配置里加上绑定规则:

bus.SubscribeAsync<BasicMessage>(async (msg, context) =>
{
    Console.WriteLine($"收到消息:{msg.Message}");
    await Task.CompletedTask; // 用这个代替Task.FromResult(true)更规范
}, ctx => ctx
    .WithExchange(x => x.WithName("myRabbit").WithAutoDelete(false).WithDurability(true))
    .WithQueue(x => x.WithName("myConsole").WithExclusivity(false).WithDurability(true).WithAutoDelete(false))
    .WithBinding(b => b.WithRoutingKey("*"))); // 用通配符接收该交换机下所有消息,也可以指定具体路由键

4. 最后再做个小检查

虽然你说队列和交换机创建成功,但还是确认下:

  • RabbitMQ服务是否正常运行在localhost:5672
  • guest账号是否有访问/虚拟主机的权限(默认是有的,如果你改过配置要核实)
  • 可以打开RabbitMQ管理UI(默认地址http://localhost:15672),查看交换机和队列的绑定关系是否存在

按照上面的步骤修改后,应该就能正常收到消息啦!

内容的提问来源于stack exchange,提问作者Splitsan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 00:53:11