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