Spring webflux 기반하에 동작되는 reactive websocket 구현.
@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);
}
}
@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);
}
}
WebSocketConfig를 통해 Tomcat, Jetty 관련 옵션을 설정하는 방법이 있다.
https://godekdls.github.io/Reactive%20Spring/websockets/
하지만 해당 프로젝트는 내부적 Netty를 사용하는 Webflux 기반하에 동작되는 프로젝트로 설정 방식 확인 필요. (max-idle-time 등)