[Spring] reactive websocket

BBinss·2022년 11월 12일
0
post-thumbnail

Spring Reactive Websocket

Spring webflux 기반하에 동작되는 reactive websocket 구현.

WebsocketConfig

@Configuration
@RequiredArgsConstructor
public class WebSocketConfig {
    private final WebSocketHandler reactiveWebSocketHandler;

    @Bean
    public HandlerMapping webSocketHandlerMapping() {
    	// TODO. root path에 websocket url 등록.
        Map<String, WebSocketHandler> handlerMap = Map.of(
                "", reactiveWebSocketHandler
        );
        return new SimpleUrlHandlerMapping(handlerMap, 1);
    }

    @Bean
    public WebSocketHandlerAdapter handlerAdapter(WebSocketService webSocketService) {
        return new WebSocketHandlerAdapter(webSocketService);
    }
}

Reactive WebSocketHandler

  1. root path로 websocket endpoint url을 등록.
  2. 해당 url을 처리할 WebSocketHandler 지정.
@Component
@RequiredArgsConstructor
public class ReactiveWebSocketHandler implements WebSocketHandler {
    private final RouteService routeService;

    @Override
    public Mono<Void> handle(WebSocketSession session) {
        Flux<WebSocketMessage> receiver = session
                .receive()
                // TODO. 1. websocket client에게 전달 받은 메세지.
                .map(WebSocketMessage::getPayloadAsText)
                // TODO. 2. 내부 routeService를 통해 처리.
                .flatMap(routeService::route)
                // TODO. 3. reactive session 처리 과정중 onError 함수를 통해 처리하여, 
				// 에러로 인한 websocket 종료처리되지 않도록 예외 처리.
                .onErrorResume(ex -> {
                    log.error("[WSS-handler] {}", ex.getMessage());
                    return Flux.just(ex.getMessage());
                })
                // TODO. 4. websocket client 메세지 응답.
                .map(session::textMessage);

        return session
                .send(receiver);
    }
}

configuration properties

WebSocketConfig를 통해 Tomcat, Jetty 관련 옵션을 설정하는 방법이 있다.
https://godekdls.github.io/Reactive%20Spring/websockets/

하지만 해당 프로젝트는 내부적 Netty를 사용하는 Webflux 기반하에 동작되는 프로젝트로 설정 방식 확인 필요. (max-idle-time 등)

profile
궁빈

0개의 댓글