Моя цель - разрешить нескольким клиентам подписываться на веб-сокет, однако документация Spring, по-видимому, очень ограничена. WRT делает это.
Текущий обработчик веб-сокета реализован следующим образом:
@Component("ReactiveWebSocketHandler")
public class ReactiveWebSocketHandler implements WebSocketHandler {
private final Flux<String> flux;
public ReactiveWebSocketHandler() throws IOException {
this.flux = new MyFlux();
@Override
public Mono<Void> handle(WebSocketSession webSocketSession) {
return webSocketSession
.send(flux.map(webSocketSession::textMessage))
.and(webSocketSession.receive()
.map(WebSocketMessage::getPayloadAsText).log());
}
}
При этом у нас есть поток строк, который отправляется клиенту.Теперь класс конфигурации websocket выглядит следующим образом:
@Configuration
public class ReactiveWebSocketConfiguration {
@Autowired
@Qualifier("ReactiveWebSocketHandler")
private WebSocketHandler webSocketHandler;
@Bean
public HandlerMapping webSocketHandlerMapping() {
Map<String, WebSocketHandler> map = new HashMap<>();
map.put("/emitter", webSocketHandler);
SimpleUrlHandlerMapping handlerMapping = new SimpleUrlHandlerMapping();
handlerMapping.setOrder(1);
handlerMapping.setUrlMap(map);
return handlerMapping;
}
@Bean
public WebSocketHandlerAdapter handlerAdapter() {
return new WebSocketHandlerAdapter();
}
}
В настоящее время не более одного клиента может подписаться на услугу.Я пытаюсь выяснить, как заставить произвольное число клиентов прослушивать сообщения в одной и той же конечной точке /emitter
.
Попытался создать дополнительные копии тех же обработчиков веб-сокетов и поместить их вкарта обработчиков, но безрезультатно.