WebSocketSession - 메세지를 보낼때 동기화 처리 경험

꾸준하게 20년·2023년 4월 25일
0

개발환경

  • spring-boot : 2.7.1
  • open-jdk11

org.springframework.web.socket.handler.TextWebSocketHandler

  • 통신을 할때 요청과 응답값으로 json 형식의 문자열을 사용하기 때문에 선택함.

afterConnectionEstablished(WebSocketSession session)

  • TextWebSocketHandler 를 상속 받고 이 메소드를 재정의 한다.
  • 이 메소드는 웹 소켓 연결이 성공하면 호출 된다.
  • 전달되는 session 객체를 별도로 저장해 두고, 필요할 때 마다 꺼내서 메세지를 보내도록 로직을 작성 하였다.

sendMessage(WebSocketMessage<?> message)

  • WebSocketSession 클래스에 있는 메소드로 요청을 보낼 때 사용한다.
  • 동일한 session 객체에 대하여 동시에 여러 곳에서 메소드를 호출 할 경우 오류가 발생하였다.
  • 해당 메서드의 설명을 보면 답이 나와 있다.

    WebSocket 세션(JSR-356)은 동시에 보내는 것을 허용하지 않습니다.
    따라서 보내기는 동기화되어야 합니다. 이를 보장하기 위해 WebSocketSession을 ConcurrentWebSocketSessionDecorator로 래핑하는 것이 하나의 옵션입니다.

아래와 같이 session 객체와 타임아웃, 버퍼 사이즈를 지정하여 랩핑한 객체를 사용하여 동시에 호출이 가능하도록 수정하여 오류를 해결 하였다.

public ConcurrentWebSocketSessionDecorator createWebSocketDecorator(WebSocketSession session) {
		return new ConcurrentWebSocketSessionDecorator(session, 1000 * 5, 1024 * 64);
	}
profile
앞으로 1년

0개의 댓글