Skip to content

事件 (Events)

Spring 会发布多个 ApplicationContext 事件,可以通过实现 Spring 的 ApplicationListener 接口来接收这些事件:

  • BrokerAvailabilityEvent: 指示代理何时可用或不可用。

    • “简单”代理在启动时立即可用并保持可用。
    • STOMP “代理中继”(Broker Relay)可能会丢失与外部全功能代理(如 RabbitMQ)的连接。当连接断开或重新建立时,会发布此事件。
    • 建议: 使用 SimpMessagingTemplate 的组件应订阅此事件,并在代理不可用时避免发送消息。
  • SessionConnectEvent: 当接收到新的 STOMP CONNECT 帧时发布,表示新客户端会话的开始。包含会话 ID、用户信息及自定义标头。

  • SessionConnectedEvent: 在 SessionConnectEvent 之后不久发布,此时代理已发送 CONNECTED 帧响应。此时 STOMP 会话才算真正建立。

  • SessionSubscribeEvent: 当接收到新的 STOMP SUBSCRIBE 帧时发布。

  • SessionUnsubscribeEvent: 当接收到新的 STOMP UNSUBSCRIBE 帧时发布。

  • SessionDisconnectEvent: 当 STOMP 会话结束时发布。可能是客户端主动发送了 DISCONNECT,也可能是 WebSocket 会话关闭时自动生成的。

TIP

使用全功能代理时,代理中继会自动尝试重连“系统”连接,但客户端连接不会自动重连。客户端通常会在 10 秒内发现心跳超时,需要自行实现重连逻辑。


补充教学

1. 监控在线人数

通过监听 SessionConnectedEventSessionDisconnectEvent 并维护一个线程安全的计数器或集合,你可以轻松实现实时的在线用户列表统计。

2. 权限预校验

虽然可以使用拦截器做逻辑,但在 SessionSubscribeEvent 中,你可以获取到用户尝试订阅的路径。如果发现越权,可以在此处记录日志或采取防御措施。

3. 断连的复杂性

SessionDisconnectEvent 可能在一个会话中触发多次(例如底层网络断开一次,STOMP 层检测到又触发一次)。因此,处理逻辑应该是幂等的,不要依赖它是唯一的断开信号。

Based on Spring Framework.