ReactJS使用STOMP连接ActiveMQ无法同时订阅多个主题如何解决
问题原因
STOMP 协议要求每个订阅请求的id头字段必须唯一,用于区分不同的订阅会话。你的代码中两次订阅共用了同一个headers对象,两个订阅的id均为username,后续的/topic/decoding订阅会直接覆盖之前同ID的/topic/salary订阅,因此服务端只会保留最后一个订阅,导致第一个订阅不生效。
如果确实调试时第一个client.subscribe断点没有触发,优先检查该行代码前后是否有语法错误,或者控制台是否抛出了JS异常导致代码执行中断。
修复方案
给两个订阅分别配置唯一的id即可,修改后代码如下:
const client = window.Stomp.client(`ws://${ipAddress}:61614`, 'aj6.stomp'); client.debug = null; client.connect('user', 'pass', () => { client.subscribe( '/topic/salary', message => { const body = JSON.parse(message.body); if (body && body.pcId) { salaries[body.pcId] = body; setState({ salaries}); } }, { id: 'sub-salary' }, // 配置唯一的订阅ID ); client.subscribe( '/topic/decoding', message => { const newBody = JSON.parse(message.body); if (newBody && newBody.PcID) { consoleMessage[newBody.PcID] = newBody; setState({ consoleMessage }); } }, { id: 'sub-decoding' }, // 配置另一个唯一的订阅ID ); });
如果修改后仍有问题,可以临时开启client.debug = console.log,查看STOMP交互帧,确认客户端是否成功发送了两个不同ID的SUBSCRIBE帧,同时检查ActiveMQ服务端是否对salary主题配置了访问权限限制。
内容的提问来源于stack exchange,提问作者SonicDash829
相关产品推荐
相关产品推荐

