Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/345.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 如何使用SpringWebFlux构建反应式内存存储库?_Java_Spring_Java 8_Spring Webflux_Project Reactor - Fatal编程技术网

Java 如何使用SpringWebFlux构建反应式内存存储库?

Java 如何使用SpringWebFlux构建反应式内存存储库?,java,spring,java-8,spring-webflux,project-reactor,Java,Spring,Java 8,Spring Webflux,Project Reactor,我正在尝试实现一个反应式内存存储库。如何做到这一点 这是我试图做的一个阻止版本 @存储库 @AllArgsConstructor 公共类InMemEventRepository实现了EventRepository{ 私人最终名单活动; @凌驾 公共作废保存(最终单声道事件){ 添加(event.block()); //event.subscribe(events::add);如果您选择Flux.fromIterable,您将只获得对以前的事件的订阅,但您将失去对未来事件的订阅 我曾经做过一次Po

我正在尝试实现一个反应式内存存储库。如何做到这一点

这是我试图做的一个阻止版本

@存储库
@AllArgsConstructor
公共类InMemEventRepository实现了EventRepository{
私人最终名单活动;
@凌驾
公共作废保存(最终单声道事件){
添加(event.block());

//event.subscribe(events::add);如果您选择Flux.fromIterable
,您将只获得对以前的事件的订阅,但您将失去对未来事件的订阅

我曾经做过一次PoC,试图获得类似的效果,你可以检查一下

其主要思想是在事件发生和订阅存储库的中心点。无论何时订阅
findAll
,您都将获得无限流的
List
。任何保存的项目都将触发新事件,订阅
findAll
的任何人都将获得它

请注意,此repo使用的是RxJava,因此可能需要一些端口到反应器

我建议为此使用

InMemEventRepository中的公共静态类{
private final Scheduler serializerScheduler=Schedulers.single();
private final Sinks.Many events=Sinks.Many().replay().all();
公共void保存(Mono事件){
事件
.publishOn(serializerScheduler)//如果事件将在多个线程上发布,则需要序列化它们
.subscribe(x->events.emitNext(x,EmitFailureHandler.FAIL_FAST));
}
公共流量findAll(){
返回事件。asFlux();
}
}
这是针对reactor 3.4的。对于较旧版本,您可以使用处理器,但现在已弃用。接收器通常更易于使用,但它们不会序列化来自多个线程的发射。这就是我使用调度程序的原因


另请参阅,以获取从水槽序列化排放的替代方法

Thank@Pelocho