SSE 연결 해제 Issue

Joy🌱·2023년 6월 6일
0

🌟 Trouble Shooting

목록 보기
10/17
post-thumbnail

❓ 문제 발생

일정 시간이 지난 후 SSE 연결(구독)이 해제 되어있어 알림이 뜨지 않을 뿐만 아니라,
공지사항 등록 시 울리는 알림 로직과 연관되어있어 새 공지사항 등록 시 아래와 같은 오류 발생

Resolved [java.lang.NullPointerException: Cannot invoke "org.apache.tomcat.util.net.SocketWrapperBase.flush(boolean)" because "this.this$0.socketWrapper" is null]
net::ERR_INCOMPLETE_CHUNKED_ENCODING 200
net::ERR_CONNECTION_REFUSED
java.lang.NullPointerException: Cannot read field "path" because "contextVersion" is null

👊 1st Try

서버에서 SseEmitter 객체 생성 시, timeout을 1시간으로 설정
👉 이미 Long.MAX_VALUE로 최대 시간이 지정되어있었으므로 실패

👊 2nd Try

클라이언트가 SSE 이벤트를 구독할 때, {retry = 3000}을 설정하여 3초마다 이벤트 구독을 하도록 함
👉 실패

👊 3rd Try

application.yml에 keep-alive-timeout 속성을 따로 추가하여 연결 지속 시간 설정
👉 실패
👉 timeout 설정 문제가 아님을 깨닫고 error가 발생할 시 eventSourceclose하는 구문에 의해 계속 연결이 해제되었던 것, error 원인을 파악해야함

👊 4th Try

EventSource 객체를 App.js 바로 다음의 상위 컴포넌트인 Layout.js의 useEffect 내부에서 생성하고 있었기 때문에 화면이 렌더링 될 때마다 호출되어 중복 생성이 원인인가 싶어 EventSource 객체를 생성하는 부분을 떼어낸 connect() 함수를 새롭게 정의하고 로그인 시 이 함수를 호출하여 중복 호출이 되지 않도록 함
👉 실패 .....

👊 5th Try

url이 문제인가싶어 @PathVariable로 받아오던 것을 @RequestParam으로 받아오는 형식으로 변경
👉 실패 ...................


✅ 해결

실시간 알림 메소드의 finally 구문에서 sseEmitter.complete(); 제외
👉 성공
👉 하나의 쪽지 알림이 실행될 때마다 메소드가 호출되는데, 첫 번째 시도 시 sseEmitter가 complete 되므로 오류가 발생했던 것.....

🥲 회고

처음으로 SSE 통신을 다루게 되면서 설정 부분에 초점을 맞추고 코드를 작성한 결과, 이렇게 사소한 실수로 인해 SSE 통신이 끊기게 될 줄 꿈에도 몰랐다 🫠.......
Finally 구문에서 complete()를 하게 되면 당연히 통신이 끊기게 될 거라는 당연한 이론적 생각을 하지 못 했다 분발하자..!

profile
Tiny little habits make me

0개의 댓글