我在电抗器堆芯中使用磁通以下代码:
Flux.create(sink -> ... /* listens to and receives from external source */ , FluxSink.OverflowStrategy.LATEST)
.flatMap(map -> redisHashReactiveCommands.hmset(key, map))
//.flatMap(... //want to store same data async into kafka with its own back pressure handling)
.subscribeOn(Schedulers.parallel())
.doOnNext(s -> log.debug("Redis consumed. Result -> {}", s))
.doOnComplete(() -> log.debug("On completed."))
.doOnError(exception -> log.error("Error occurred while consuming message", exception))
.subscribe();
如您所见,我对此过程有反压力处理,这是我过程的外部源(FluxSink.OverflowStrategy.LATEST)。但是,我还想为我的流程配置背压以重做(redisHashReactiveCommands.hmset(key,map)),因为它可能比流程的外部来源更大。我希望我需要为redis零件创建另一个通量并将其与该通量链接,但是由于.flatMap适用于单个项目而不是项目流,我如何实现这一点?
另外,我也想将相同的发射项存储到Kafka中,但是链接flapMap似乎不起作用..是否有一种简单的方法可以将所有这些链接到一组功能调用中(外部源->我的进程,我的进程-> redis,我的进程-> kafka)?
答案 0 :(得分:1)
如果您对主序列中的结果对象不感兴趣,则可以在flatMap
内合并两个保存。您必须移动subscribeOn并在flatMap内登录,然后将其放在内部保存发布者上:
Flux.create(sink -> ... /* listens to and receives from external source */ , FluxSink.OverflowStrategy.LATEST)
.flatMap(map -> Mono.when(
redisHashReactiveCommands.hmset(key, map)
.subscribeOn(Schedulers.parallel())
.doOnNext(s -> log.debug("Redis consumed. Result -> {}", s)),
kafkaReactiveCommand.something(map)
.subscribeOn(Schedulers.parallel())
.doOnNext(s -> log.debug("Kafka consumed. Result -> {}", s)),
))
//... this results in a Mono<Void>
.doOnComplete(() -> log.debug("Both redis and kafka completed."))
.doOnError(exception -> log.error("Error occurred while consuming message", exception))
.subscribe();
或者,如果您确定两个过程都发出结果元素或错误,则可以将Tuple2
替换为{{ 1}}。