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
相关产品推荐
相关产品推荐

