【问题标题】:Spring Websocket and Stomp with RabbitMQ- Heartbeat listener/interceptorSpring Websocket 和 Stomp 与 RabbitMQ-心跳监听器/拦截器
【发布时间】:2021-12-14 15:57:06
【问题描述】:

我有一个带有 Websocket 和 Stomp 的 Spring 应用程序以及一个 RabbitMQ 服务器集群。 Websocket 客户端配置为发送心跳,RabbitMQ 响应正常。我在我的服务器之间保留所有 Websocket 会话的分布式缓存,并在添加或删除连接时更新缓存。但是,如果服务器出现故障,或者在没有触发适当事件的情况下丢失连接,则该服务器上所有断开连接的连接都将使用我当前的配置保留在缓存中。我正在考虑在 Hazelcast 上设置空闲时间,并以某种方式捕捉心跳并在缓存上执行包含/获取以刷新项目。但是,我既无法使用@MessageMapping 捕捉控制器中的心跳,也无法找到心跳的侦听器。我怎样才能做到这一点?

【问题讨论】:

    标签: spring-boot rabbitmq spring-websocket stomp


    【解决方案1】:

    如果BrokerAvailabilityEvent 对你有用,我会徘徊:

    /**
     * Creates a new {@code BrokerAvailabilityEvent}.
     *
     * @param brokerAvailable {@code true} if the broker is available, {@code}
     * false otherwise
     * @param source the component that is acting as the broker, or as a relay
     * for an external broker, that has changed availability. Must not be {@code
     * null}.
     */
    public BrokerAvailabilityEvent(boolean brokerAvailable, Object source) {
    

    看起来它是从StompBrokerRelayMessageHandler.SystemSessionConnectionHandler.handleTcpConnectionFailure(String errorMessage, @Nullable Throwable ex) 发出的。

    【讨论】:

    • 我认为不会。这里的兴趣点是 Websocket 连接到 Springboot。如果我能以某种方式拦截心跳(客户端和通过 stompBrokerRelay 中继的 rabbitmq 之间的乒乓球),那么我可以在我的 hazelcast 分布式地图上执行 put/get/contains 以刷新缓存中的该项目。当服务器宕机时,只要不刷新项目,它们就会被 Hazelcast 删除。我希望很清楚我在这里想要实现的目标。
    • 基本上,在多服务器环境中,如何在分布式缓存中跟踪我的会话,因为服务器可以随时关闭而没有机会清理连接到它的套接字缓存...