通过websocket

时间:2018-06-03 14:13:33

标签: spring-boot websocket reactive

只有在收到来自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));

    }
}

0 个答案:

没有答案