在 Spring Integration 中检测 Websocket 断开连接

问题描述 投票:0回答:1

我有一个基于 WebSocketInboundChannelAdapter 的集成流程,配置如下。

@Bean
IntegrationFlow integrationFlow() {
  StandardWebSocketClient client = new StandardWebSocketClient();
  ClientWebSocketContainer container = new ClientWebSocketContainer(client, url);
  WebSocketInboundChannelAdapter adapter = new WebSocketInboundChannelAdapter(container);
  return IntegrationFlow.from(adapter).handle(m -> m.getPayload()).get();
}

如何检测断开连接并重新连接到同一 URL?

java spring spring-boot spring-integration spring-websocket
1个回答
0
投票

解决这个问题的一种方法是实现一个 ApplicationListener 来监听 SessionDisconnectEvent

import org.springframework.context.ApplicationListener;
import org.springframework.integration.websocket.event.WebSocketSessionConnectEvent;
import org.springframework.integration.websocket.event.WebSocketSessionDisconnectEvent;
import org.springframework.messaging.Message;
import org.springframework.messaging.support.GenericMessage;
import org.springframework.stereotype.Component;
import org.springframework.web.socket.WebSocketSession;

@Component
public class WebSocketReconnectHandler implements ApplicationListener<WebSocketSessionDisconnectEvent> {

    private final ClientWebSocketContainer container;
    private final String url;

    public WebSocketReconnectHandler(ClientWebSocketContainer container, String url) {
        this.container = container;
        this.url = url;
    }

    @Override
    public void onApplicationEvent(WebSocketSessionDisconnectEvent event) {
        WebSocketSession session = event.getSession();
        if (session.isOpen()) {
            // WebSocket session disconnected; initiate a reconnect
            try {
                container.doStop();
                // Perform any additional cleanup or logging if needed
            } catch (Exception e) {
                e.printStackTrace();
            }

            // Reconnect after a delay (e.g., 5 seconds)
            try {
                Thread.sleep(5000);
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
            }

            // Re-create and start the WebSocket container
            container.setUri(url);
            container.doStart();

            // You may want to log or perform additional actions here
        }
    }
}

在此示例中,我们创建一个自定义 WebSocketReconnectHandler 来侦听 WebSocketSessionDisconnectEvent 事件。当发生断开连接事件时,处理程序执行以下操作:

  1. 验证 WebSocket 会话是否仍处于打开状态。
  2. 停止 WebSocket 容器。
  3. 在尝试重新连接之前等待延迟(您可以根据需要调整延迟)。
  4. 使用相同的 URL 重新配置并启动 WebSocket 容器。

HTH.

© www.soinside.com 2019 - 2024. All rights reserved.