트러블슈팅

STOMP 연결, 해제 시 header 값 Error

계양 꿀주먹 2024. 8. 15. 23:38

문제

ChatService에서 @EventListener 를 통해 프론트에서 header 에 같이 넣어준 chatRoomId와 socket session id의 값을 제대로 가져오지 못 하는 문제가 발생


원인

  • 기존 코드
    @EventListener
    public void handleSessionConnect(SessionConnectEvent event) {
        MessageHeaderAccessor accessor = NativeMessageHeaderAccessor.getAccessor(event.getMessage(), SimpMessageHeaderAccessor.class);
        GenericMessage generic = (GenericMessage) accessor.getHeader("simpConnectMessage");
        Map nativeHeaders = (Map) generic.getHeaders().get("nativeHeaders");
        Long chatRoomId = Long.parseLong((String) ((List) nativeHeaders.get("chatRoomId")).get(0));
        String sessionId = (String) generic.getHeaders().get("simpSessionId");
		
        ...
    }

MessageHeaderAccessor 객체를 통해 값을 가져오려했지만, 계속해서 header의 값을 가져오지 못 했다.


해결

@EventListener
public void handleSessionConnect(SessionConnectEvent event) {
    StompHeaderAccessor accessor = StompHeaderAccessor.wrap(event.getMessage());

    GenericMessage generic = (GenericMessage) accessor.getHeader("simpConnectMessage");
    Map nativeHeaders = (Map) generic.getHeaders().get("nativeHeaders");
    Long chatRoomId = Long.parseLong((String) ((List) nativeHeaders.get("chatRoomId")).get(0));
    String sessionId = (String) generic.getHeaders().get("simpSessionId");
    
    ...
}

MessageHeaderAccessor가 아닌 StompHeaderAccessor 객체를 통해 header에서 필요한 정보를 추출해 사용했다.