복붙노트

[SPRING] Java Spring Tomcat에서 응답이없는 웹 소켓을 어떻게 빨리 닫을 수 있습니까?

SPRING

Java Spring Tomcat에서 응답이없는 웹 소켓을 어떻게 빨리 닫을 수 있습니까?

Spring Boot Tomcat을 실행중인 Spring Framework 서버에 연결하기 위해 웹 소켓을 사용하는 클라이언트와 실시간 응용 프로그램을 가지고 있습니다. 클라이언트가 네트워크 연결이 끊어 지거나 다른 문제로 인해 응답을 멈추고 websocket을 닫을 때 서버가 신속하게 (5 초 이내에) 감지하도록합니다.

나는 노력했다.

ServletServerContainerFactoryBean과 내 세대의 ClientHandlers 사이의 링크가 보이지 않기 때문에 이것이 올바르게 구현되었는지 확신 할 수 없습니다.

이 테스트 방법은 다음과 같습니다.

Spring FrameworkTomcat 서버는 클라이언트가 연결이 끊어 졌거나 응답하지 않아 웹 소켓을 닫는 것을 어떻게 빨리 감지합니까?

해결법

  1. ==============================

    1.응용 프로그램 이벤트가 도움이 될 수 있습니다.

    응용 프로그램 이벤트가 도움이 될 수 있습니다.

    추신 : 주석 기반 이벤트

    PS2 : 당신을위한 예제 프로젝트를 만들었습니다.

  2. ==============================

    2.ServletServerContainerFactoryBean은 시작시 스프링 구성을 통해 기본 JSR-356 WebSocketContainer를 구성하기 만합니다. 내부를 들여다 보면 사소한 것을 알 수 있습니다.

    ServletServerContainerFactoryBean은 시작시 스프링 구성을 통해 기본 JSR-356 WebSocketContainer를 구성하기 만합니다. 내부를 들여다 보면 사소한 것을 알 수 있습니다.

    maxSessionIdleTimeout 처리에 대한 Tomcat 코드에서 볼 수 있듯이 WsWebSocketContainer # backgroundProcess () 메서드는 기본적으로 만료 된 세션이 있는지 확인하기 위해 매 10 초마다 실행됩니다.

    나는 또한 당신이 서버에서 보내는 핑 (ping)이 세션을 활성 상태로 보이게하고, 따라서 유휴 세션 타임 아웃 구성과 관련하여 도움이되지 않는다고 의심한다.

    Tomcat이 클라이언트의 연결이 빨리 끊어지는 것을 인식하지 못하는 이유에 관해서는 정말로 말할 수 없습니다. 내 경험에 의하면 클라이언트가 WebSocket 연결을 닫거나 브라우저를 죽이면 즉시 감지됩니다. 어쨌든 Spring과는 다른 Tomcat과 더 관련이 있습니다.

  3. ==============================

    3.필자가 취한 접근법은 애플리케이션 계층 핑퐁 프로토콜을 구현하는 것이었다.

    필자가 취한 접근법은 애플리케이션 계층 핑퐁 프로토콜을 구현하는 것이었다.

    기본 TCP 연결에서 시간 초과를 사용하여이를 구현하는 훨씬 간단한 방법이 있어야합니다.

  4. from https://stackoverflow.com/questions/26193072/how-do-you-quickly-close-a-nonresponsive-websocket-in-java-spring-tomcat by cc-by-sa and MIT license