I.K.Picture & IT Info.

[WebSocket] Java Spring에서 WebSocket 데이터 보낼 때 TEXT_PARTIAL_WRITING 오류 본문

Development/Web

[WebSocket] Java Spring에서 WebSocket 데이터 보낼 때 TEXT_PARTIAL_WRITING 오류

helpful-intruder 2020. 11. 26. 23:05
반응형

간단하면서.. 모르면 이유를 도저히 모르는 내용에 대해 오늘은 

올려보려고 합니다.

 

Spring에서 WebSocket사용하다보면 여러 클래스에서 데이터를 보낼 때가 있는데... (반복적으로)

간혹 

The remote endpoint was in state [TEXT_PARTIAL_WRITING] which is an invalid stat e for called method

오류가 나는 경우가 있습니다.

과연 무엇일까요...??

 

저 같은 경우에는 Quartz (스케줄러) 서비스를 하면서 Websocket으로 데이터를 보내는 경우였습니다.

총 2개(이상)의 스케줄러가 있었고..

각 각 5초, 10초 마다 .. 데이터를 일정하게 보내도록 되어 있는데

이게 간혹 2개가 서로 동시에 보내려다보니 저런 오류가 나는 것을 확인할 수 있었습니다.

 

그래서!! 이를 해결하는 방법은 바로 아주 간단히..

send 부분을 sychronized로 묶어주는 겁니다.. (너무 간단하죠..?)

 

아래 소스코드 예를 보면 더 쉬우실 꺼예요

 

public boolean sendMessageToUser(String clientId, TextMessage message) {
    WebSocketSession session = socketMap.get(clientId);
      if(session==null) {
        return false;
      }
      if (!session.isOpen()) {
        return false;
     
}
      try {
         synchronized (session) {
            session.sendMessage(message);
         }
      } catch (IOException e) {
         e.printStackTrace();
      }
   return true;
}

 

보내는 함수에 바로 저렇게 synchronized로 모두 묶어주면 

동시에 보낼 때 잠시 락을 걸게되고 끝나면 보내는 형태로 

 

충돌을 방지할 수 있습니다 :) 

반응형
Comments