使用stomp.js订阅RabbitMQ Topic交换机时如何设置路由键为#?
问题分析与解决方案
你的现有实现确实存在问题,这正是导致自动生成空路由键队列的原因。
为什么当前代码会出现这个问题?
当你使用client.subscribe('/exchange/foo', function() {...})这种写法时,STOMP客户端默认会把路由键设为空字符串,同时因为没有指定队列名称,RabbitMQ会自动创建一个以stomp-subscription-为前缀的临时专属队列,并将这个队列以空路由键绑定到foo这个topic exchange上。这就意味着:
- 每个新订阅都会生成一个独立的队列
- 只有发送到
fooexchange且路由键为空的消息才会被这些队列接收,完全不符合你想要匹配所有路由键的需求
正确的实现方式
要设置路由键为#(topic模式下匹配所有路由键的通配符),你需要在订阅路径里明确指定路由键。STOMP与RabbitMQ交互的标准格式是:
/exchange/{exchangeName}/{routingKey}
修改后的代码如下:
var ws = new SockJS('http://127.0.0.1:15674/stomp') var client = Stomp.over(ws) client.subscribe('/exchange/foo/#', function(message) { // 处理接收到的消息逻辑 })
额外补充:自定义队列或共享队列
如果你的需求是让多个订阅者共享同一个队列(实现负载均衡的消费模式),而不是每个订阅者都有独立队列,可以在订阅时通过headers指定队列名称:
client.subscribe('/exchange/foo/#', function(message) { // 处理消息逻辑 }, { 'x-queue-name': 'shared-topic-queue' // 指定自定义队列名 })
这样所有使用这个配置订阅的客户端都会绑定到同一个shared-topic-queue队列,消息会以轮询的方式分发给不同的消费者;如果不指定这个参数,每个订阅还是会生成独立的临时队列,每个消费者都能收到所有匹配#的消息(标准的发布订阅模式)。
内容的提问来源于stack exchange,提问作者Govinda Sakhare
相关产品推荐
相关产品推荐

