事件 (Events)
Spring 会发布多个 ApplicationContext 事件,可以通过实现 Spring 的 ApplicationListener 接口来接收这些事件:
BrokerAvailabilityEvent: 指示代理何时可用或不可用。- “简单”代理在启动时立即可用并保持可用。
- STOMP “代理中继”(Broker Relay)可能会丢失与外部全功能代理(如 RabbitMQ)的连接。当连接断开或重新建立时,会发布此事件。
- 建议: 使用
SimpMessagingTemplate的组件应订阅此事件,并在代理不可用时避免发送消息。
SessionConnectEvent: 当接收到新的 STOMPCONNECT帧时发布,表示新客户端会话的开始。包含会话 ID、用户信息及自定义标头。SessionConnectedEvent: 在SessionConnectEvent之后不久发布,此时代理已发送CONNECTED帧响应。此时 STOMP 会话才算真正建立。SessionSubscribeEvent: 当接收到新的 STOMPSUBSCRIBE帧时发布。SessionUnsubscribeEvent: 当接收到新的 STOMPUNSUBSCRIBE帧时发布。SessionDisconnectEvent: 当 STOMP 会话结束时发布。可能是客户端主动发送了DISCONNECT,也可能是 WebSocket 会话关闭时自动生成的。
TIP
使用全功能代理时,代理中继会自动尝试重连“系统”连接,但客户端连接不会自动重连。客户端通常会在 10 秒内发现心跳超时,需要自行实现重连逻辑。
补充教学
1. 监控在线人数
通过监听 SessionConnectedEvent 和 SessionDisconnectEvent 并维护一个线程安全的计数器或集合,你可以轻松实现实时的在线用户列表统计。
2. 权限预校验
虽然可以使用拦截器做逻辑,但在 SessionSubscribeEvent 中,你可以获取到用户尝试订阅的路径。如果发现越权,可以在此处记录日志或采取防御措施。
3. 断连的复杂性
SessionDisconnectEvent 可能在一个会话中触发多次(例如底层网络断开一次,STOMP 层检测到又触发一次)。因此,处理逻辑应该是幂等的,不要依赖它是唯一的断开信号。