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

@stomp/stomp.js如何检测订阅是否成功完成?

检测STOMP订阅成功的两种实现方式

1. 利用STOMP的Receipt机制确认订阅请求已被服务器处理

STOMP协议自带receipt机制,客户端发起订阅时指定receipt-id,服务器处理完订阅请求后会返回RECEIPT帧,通过监听这个帧就能确认订阅请求已被服务器接收并处理。

代码示例:

import { Client } from '@stomp/stompjs';

const client = new Client({
  brokerURL: 'ws://your-spring-boot-server/ws',
  // 其他连接配置...
});

client.onConnect = () => {
  const receiptId = `sub-receipt-${Date.now()}`;
  
  // 监听RECEIPT帧,匹配指定的receipt-id
  client.onReceipt = (receipt) => {
    if (receipt.headers['receipt-id'] === receiptId) {
      console.log('订阅请求已被服务器确认处理');
      // 这里执行订阅成功后的业务逻辑
    }
  };

  // 发起订阅并携带receipt-id参数
  const subscription = client.subscribe('/topic/your-target-topic', (message) => {
    // 处理收到的消息内容
  }, {
    'receipt-id': receiptId
  });
};

client.activate();

2. 监听ERROR帧处理订阅失败场景

当Spring Boot拦截器拒绝订阅时,服务器应返回ERROR帧,你可以通过客户端的onStompError回调捕获该错误,以此判断订阅失败。

代码示例:

client.onStompError = (frame) => {
  console.error('服务器返回错误:', frame.headers.message);
  // 根据服务端返回的错误信息判断是否为订阅权限问题
  if (frame.headers.message.includes('无权限订阅')) {
    console.log('订阅失败:当前用户无权限访问该主题');
  }
};

补充说明

STOMP协议本身没有专门的「订阅成功」通知,RECEIPT仅代表服务器已处理订阅请求。结合ERROR监听,就能覆盖两种核心场景:

  • 订阅成功:收到RECEIPT且无ERROR帧返回
  • 订阅失败:收到ERROR帧(对应拦截器拒绝的情况)

需要确保Spring Boot服务在拦截器拒绝订阅时,正确抛出StompException或通过StompHeaderAccessor设置错误信息,保证客户端能捕获到对应的ERROR帧。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 00:27:34