【问题标题】:ReactJS: STOMP subscription to multiple topicsReactJS:STOMP 订阅多个主题
【发布时间】:2023-07-14 18:50:01
【问题描述】:

我的 React 代码创建了一个到我们公司的 ActiveMQ 5.15.5 服务器的 WebSocket 连接,然后订阅了以下两个主题:salarydecoding。问题是代码只能订阅其中一个主题。它不能同时订阅两者。

const client = window.Stomp.client(`ws://${ipAddress}:61614`, 'aj6.stomp');
const headers = { id: 'username' };
client.debug = null;
client.connect('user', 'pass', () => {
    client.subscribe(  
      '/topic/salary',  //BREAKPOINT was set here
      message => {
        const body = JSON.parse(message.body);
        if (body && body.pcId) {
          salaries[body.pcId] = body;
          setState({ salaries});
        }
      },
      headers,
    );
    client.subscribe(
      '/topic/decoding',  //BREAKPOINT was set here
      message => {
        const newBody = JSON.parse(message.body);
        if (newBody && newBody.PcID) {
          consoleMessage[newBody.PcID] = newBody;
          setState({ consoleMessage });
        }
      },
      headers,
    );
});

所以在上面的代码中,我在client.subscribe('/topic/decoding...client.subscribe('/topic/salary... 处设置了一个断点。我看到它只订阅/topic/decoding 而不是/topic/salary

有谁知道我可以如何解决这个问题,以便它订阅这两个主题?

【问题讨论】:

  • 你最近不是问过同样的基本问题吗?现在好像被删了。请说清楚。谢谢!
  • 是的,我有,但我在获得更多信息后更新了它。另外,如果它非常基本,您认为您可以提供答案吗?
  • “相同的基本问题”并不是说这个问题是基本的,而是您的新问题与旧问题“基本相同”。我无法确认它是否完全一样,因为旧的已经被删除了。此外,如果您有新信息要添加到问题中,那么只需更新问题,而不是删除它并创建一个新问题。
  • 很公平,下次我会记住的

标签: reactjs activemq spring-websocket stomp


【解决方案1】:

尝试创建 2 个客户端,例如:

const salaryClient = window.Stomp.client(`ws://${ipAddress}:61614`, 'aj6.stomp');
const salaryHeaders = { id: 'salary' };
salaryClient.debug = null;
salaryClient.connect('user', 'pass', () => {
    salaryClient.subscribe(  
      '/topic/salary',
      message => {
        const body = JSON.parse(message.body);
        if (body && body.pcId) {
          salaries[body.pcId] = body;
          setState({ salaries});
        }
      },
      salaryHeaders,
    );
});
const decodingClient = window.Stomp.client(`ws://${ipAddress}:61614`, 'aj7.stomp');
const decodingHeaders = { id: 'decoding' };
decodingClient.debug = null;
decodingClient.connect('user', 'pass', () => {
    decodingClient.subscribe(
      '/topic/decoding',
      message => {
        const newBody = JSON.parse(message.body);
        if (newBody && newBody.PcID) {
          consoleMessage[newBody.PcID] = newBody;
          setState({ consoleMessage });
        }
      },
      decodingHeaders,
    );
});

【讨论】:

  • 不幸的是,它似乎不起作用,我仍然遇到同样的问题。在我分别连接/订阅新的客户端/主题之前,我是否可能需要取消订阅或断开连接?
  • ActiveMQ 可以处理多个连接和订阅。否则就有点一文不值了。因此,我不明白为什么需要断开一个客户端才能连接另一个客户端。订阅甚至不在同一个主题上。我已经稍微更新了我的答案。你能试试吗?
  • 嘿,我尝试了您的新解决方案,看起来我仍然遇到同样的问题。由于某种原因,解码代码根本没有运行,我知道为什么
  • 尝试打开 STOMP 协议调试日志记录,如“调试”部分 here 中所述。然后运行您的客户端并将日志输出添加到您的问题中。
【解决方案2】:

From Stomp documentation:

由于单个连接可以与服务器有多个打开的订阅,因此帧中必须包含 id 标头以唯一标识订阅。 id 标头允许客户端和服务器将后续的 MESSAGE 或 UNSUBSCRIBE 帧与原始订阅相关联。 在同一个连接中,不同的订阅必须使用不同的订阅标识符。

Stomp API 定义:

subscribe(destination, callback, headers = {})

因此,据我了解,您的两个订阅不能使用相同的 username id

【讨论】:

  • 是否可以注销然后使用相同的标题重新登录?