Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring被动-收到新消息时发生的事件_Java_Spring_Spring Mvc_Reactive Programming_Spring Webflux - Fatal编程技术网

Java Spring被动-收到新消息时发生的事件

Java Spring被动-收到新消息时发生的事件,java,spring,spring-mvc,reactive-programming,spring-webflux,Java,Spring,Spring Mvc,Reactive Programming,Spring Webflux,我有一个与spring反应式webflux的聊天应用程序。创建新消息时,所有订阅者都会收到该消息(这只是简化我的问题的一个示例)。一切正常,工作正常。但是,现在当新消息到达时,我需要订阅者的事件。 这是我的代码: 控制器: @Autowired @Qualifier("ptpReplayProcessor") private ReplayProcessor<String> ptpReplayProcessor; @GetMapping(value = "/chat/subscrib

我有一个与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);
}
@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;
    }
}
@Autowired
@限定符(“ptpReplayProcessor”)
专用重放处理器ptpReplayProcessor;
@GetMapping(value=“/chat/subscribe”,products=MediaType.TEXT\u EVENT\u STREAM\u value)
公共流量订阅(){
来自(PTPreplay处理器)的返回通量;
}
重放处理器配置:

@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);
}
@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;
    }
}
@配置
公共类ReplayProcessorConfig{
@Bean(“ptpReplayProcessor”)
ReplayProcessor ptpReplayProcessor(){
ReplayProcessor ReplayProcessor=ReplayProcessor.create(0,false);
replayProcessor.subscribe(新的BaseSubscriber(){
@凌驾
受保护的void hookOnNext(字符串ptp){
System.out.println(“调用了重播处理器!”);
}
});
返回重放处理器;
}
}
pom.xml

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

离子交换反应器
堆芯

当创建新消息时,我调用
ptpReplayProcessor.onNext(message)
。这工作正常,所有客户端都会收到消息,但短语
重播处理器被调用仅从邮件发件人处打印。我想在收到新消息时为所有客户端引发一个事件。我还尝试了
ReplayProcessor.doOnNext()
ReplayProcessor.doOnEach()
方法,但没有成功。有什么方法可以做到这一点吗?

您可以通过订阅方法:

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

你所说的“我想为所有客户端引发一个事件”是什么意思?当新消息到达时,我需要在后端为客户端做一些事情(假设做一些检查或日志记录)。他们已经收到了消息。为什么需要额外的事件?客户端在客户端接收消息,但我希望在服务器端接收事件。因此,如果您有5个客户端,您希望在服务器端为每条消息引发5个事件?
doOnNext
仅针对消息的发送者,而不是接收者。我在问题中指出,此事件不起作用。在您的场景中,您正在replay处理器上添加onNext事件。因此,只有当replay处理器收到要发送的消息时,才会触发该事件。在我的例子中,我在flux上添加了onNext事件,它负责向具体用户发送消息,因此每个用户的每条消息都会触发onNext事件。所以你可以有效地说客户收到了一条信息。如果您想确保消息被正确地传递,则无法仅在服务器端解决此问题。客户端也必须进行某种形式的确认。