Spring React-接收新消息时发生的事件

时间:2019-03-28 19:14:56

标签: java spring spring-mvc reactive-programming spring-webflux

我有一个带有Spring反应式Webflux的聊天应用程序。创建新消息时,所有订阅者都会收到该消息(这只是简化我的问题的一个示例)。一切都正确并完美地工作。但是,现在我需要新消息到达时为订户提供一个事件。

这是我的代码:

控制器:

@Autowired
@Qualifier("ptpReplayProcessor")
private ReplayProcessor<String> ptpReplayProcessor;

@GetMapping(value = "/chat/subscribe", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
public Flux<String> subscribe() {
    return Flux.from(ptpReplayProcessor);
}

ReplayProcessorConfig:

@Configuration
public class ReplayProcessorConfig {
    @Bean("ptpReplayProcessor")
    ReplayProcessor<String> ptpReplayProcessor() {
        ReplayProcessor<String> replayProcessor = ReplayProcessor.create(0, false);
        replayProcessor.subscribe(new BaseSubscriber<String>() {
            @Override
            protected void hookOnNext(String ptp) {
                System.out.println("replay processor called!");
            }

        });
        return replayProcessor;
    }
}

pom.xml

<dependency>
    <groupId>io.projectreactor</groupId>
    <artifactId>reactor-core</artifactId>
</dependency>

在创建新消息时,我致电ptpReplayProcessor.onNext(message)。这可以正常工作,并且所有客户端都收到消息,但是短语replay processor called!仅从消息发件人打印。我想在收到新消息时为所有客户端引发一个事件。我也尝试了ReplayProcessor.doOnNext()ReplayProcessor.doOnEach()方法,但是没有用。有什么办法吗?

1 个答案:

答案 0 :(得分:2)

您可以在您的订阅方法上执行此操作:

return Flux.from(ptpReplayProcessor).doOnNext(s -> System.out.println("new message has been sent"));