只有在收到来自kafka监听器的消息时,如何使用反应websocket触发消息发送?
我有以下简单的websocket和kafka监听器实现,但无法弄清楚如何每次从kafka监听器触发webSocketSession.send()方法。
Kafka主题监听器:
@Service
public class SomeEventHandler {
@StreamListener(SomeTopic.INPUT)
public Mono<Void> handle(SomeEvent someEvent) {
// TODO: Save to db
// TODO: Call send of message via websocket passing some parameters
}
}
WebSocket配置:
@Configuration
public class WebSocketConfiguration {
private final WebSocketHandler webSocketHandler;
@Autowired
public WebSocketConfiguration(WebSocketHandler webSocketHandler) {
this.webSocketHandler = webSocketHandler;
}
@Bean
public HandlerMapping webSocketHandlerMapping() {
Map<String, WebSocketHandler> map = new HashMap<>();
map.put("/event-emitter", webSocketHandler);
SimpleUrlHandlerMapping handlerMapping = new SimpleUrlHandlerMapping();
handlerMapping.setOrder(-1); // before annotated controllers
handlerMapping.setUrlMap(map);
return handlerMapping;
}
@Bean
public WebSocketHandlerAdapter handlerAdapter() {
return new WebSocketHandlerAdapter();
}
}
WebSocketHandler:
@Component
public class ReactiveWebSocketHandler implements WebSocketHandler {
private static final ObjectMapper json = new ObjectMapper();
private Flux<String> eventFlux = Flux.generate(sink -> {
SomeInfoEvent someInfoEvent = new DashboardInfoEvent(UUID.randomUUID(), LocalDateTime.now().toString());
try {
sink.next(json.writeValueAsString(someInfoEvent));
} catch (JsonProcessingException e) {
sink.error(e);
}
});
// Don't want to send every 5 seconds, only when some kafka message received
// private Flux<String> intervalFlux = Flux.interval(Duration.ofSeconds(5L))
// .zipWith(eventFlux, (time, event) -> event);
@Autowired
public ReactiveWebSocketHandler(UserRepository userRepository) {
this.userRepository = userRepository;
}
@Override
public Mono<Void> handle(WebSocketSession webSocketSession) {
// TODO: Somehow I need to call this method when some kafka message received
return webSocketSession.send(eventFlux.map(webSocketSession::textMessage));
}
}