Spring

WebSocket(2)

Domae_ 2023. 5. 25. 22:34
SMALL
ChannelInterceptor 란?

WebSocket 에서 연결과 통신할때 인터셉트해서 쓰는 인터페이스이다. 

아래의 매서드를 통해 재정의하여 preSend() 라는 매서드를 통해 StompCommand enum 클래스를 통해 StompHeaderAccessor accessor = StompHeaderAccessor.wrap(message) 를 선언하여 해당 상태를 비교하여, 처리할수 있다.
또한 StompHeaderAccessor 는 STOMP 헤더(예: 대상, 콘텐츠 유형 등)를 기반으로 하는 공통 처리 헤더를 관리한다.

    @Override
    public Message<?> preSend(Message<?> message, MessageChannel channel) {
        return message;
    }

 

ChannelInterceptor 예제

아래의 방식되로 채팅 인원수를 관리하여 오류를 던질수 있다.

@Slf4j
@Component
@RequiredArgsConstructor
public class WebScoketInterceptor implements ChannelInterceptor {

    @Autowired
    private ChatRoomService chatRoomService;

    HashMap<String, Integer> roomList = new HashMap<>();

    @Override
    public Message<?> preSend(Message<?> message, MessageChannel channel) {
        StompHeaderAccessor accessor = StompHeaderAccessor.wrap(message);
        MessageHeaders headers = message.getHeaders(); //메세지 들어올때 헤더
        MultiValueMap<String, String> map = headers.get(StompHeaderAccessor.NATIVE_HEADERS, MultiValueMap.class);

        if (StompCommand.CONNECT == accessor.getCommand()) {
            System.out.println("처음 접속할때");
        } else if (StompCommand.SUBSCRIBE == accessor.getCommand()) { //roomId
            String chatRoomId = map.getFirst("roomId");

            if (!(roomList.containsKey(chatRoomId))) {
                roomList.put(chatRoomId, 1);
            }else {
                roomList.put(chatRoomId, roomList.get(chatRoomId) + 1);
            }
            if (roomList.get(chatRoomId) > chatRoomService.check_roomPeople(chatRoomId)) {
                throw new IllegalStateException("인원 초과");
            }

            System.out.println("주소 구독할때");
        } else if (StompCommand.SEND == accessor.getCommand()) {
            System.out.println("메세지 보낼때");
        } else if (StompCommand.DISCONNECT == accessor.getCommand()) {
            System.out.println(map);
            System.out.println("접속 끊을때");
        }
        return message;
    }

}

 

 

WebSocketChatEventListener 란?

WebSocketChatEventListener 란? Session 연결될때 발생되는 EventHandler 이다.

아래의 예제를 보면 이해가 된다.

@Component
@RequiredArgsConstructor
public class WebSocketChatEventListener {

    private final SimpMessageSendingOperations template;

    //구독할려고 할때 발생되는 이벤트
    @EventListener
    public void handlerConnetionListener(SessionConnectEvent event) {
        System.out.println("테스트 연결");
    }

    @EventListener
    public void handlerDisconnectionListener(SessionDisconnectEvent event) {
        System.out.println("테스트 끊김");
    }

}
반응형
LIST