几个 ApplicationContext 事件被发布,可以通过实现 Spring的ApplicationListener 接口来接收。
BrokerAvailabilityEvent:指示消息代理(broker)何时变得可用或不可用。虽然 「simple」代理在启动时立即可用,并在应用程序运行时保持可用,但 STOMP 「代理中继」可能会失去与全功能代理的连接(例如,如果代理被重新启动)。代理中继有重新连接的逻辑,当它回来时重新建立与搭理的 「system」 连接。因此,只要状态从连接变为断开,反之亦然,就会发布这个事件。使用 SimpMessagingTemplate 的组件应该订阅这个事件,并避免在代理不可用时发送消息。在任何情况下,他们应该准备好在发送消息时处理 MessageDeliveryException。
SessionConnectEvent:当收到一个新的 STOMP CONNECT 时发布,表示一个新的客户会话的开始。该事件包含代表连接的消息,包括会话 ID、用户信息(如果有的话),以及客户端发送的任何自定义头信息。这对于跟踪客户端会话是很有用的。订阅此事件的组件可以用 SimpMessageHeaderAccessor 或 StompMessageHeaderAccessor 包装包含的消息。
SessionConnectedEvent:在 SessionConnectEvent 之后不久发布,当代理发送一个 STOMP CONNECTED 帧作为对CONNECT 的响应。在这一点上,STOMP 会话可被视为完全建立。
SessionSubscribeEvent:当收到一个新的 STOMP SUBSCRIBE 时发布。
SessionUnsubscribeEvent:当收到一个新的 STOMP UNSUBSCRIBE 时发布。
SessionDisconnectEvent:当一个 STOMP 会话结束时发布。DISCONNECT 可能是由客户端发送的,也可能是在 WebSocket 会话关闭时自动生成的。在某些情况下,这个事件会在每个会话中发布一次以上。对于多个断开事件,组件应该是闲置的。
:::info 当你使用一个全功能的代理时,如果代理暂时不可用,STOMP 的 「代理中继」会自动重新连接 「system」的连接。然而,客户端连接不会自动重新连接。假设心脏跳动被启用,客户端通常会在 10 秒内注意到代理没有响应。客户端需要实现他们自己的重新连接逻辑。 :::