Java 如何使用Project Reactor使用动态值重复或重试?
我有一个方法,它进行服务调用并以Mono的形式返回一个值。在得到所需的值之前,我必须重复执行此方法,并进行一些退避 我正试图使用ProjectReactor的Java 如何使用Project Reactor使用动态值重复或重试?,java,reactive-programming,repeat,project-reactor,Java,Reactive Programming,Repeat,Project Reactor,我有一个方法,它进行服务调用并以Mono的形式返回一个值。在得到所需的值之前,我必须重复执行此方法,并进行一些退避 我正试图使用ProjectReactor的repeat()功能来解决这个需求 我的用例的一个简化示例如下: Mono<Boolean> evaluateValue = fetchValueFromService(id) .filter(value -> { if (value != requiredValue) {
repeat()
功能来解决这个需求
我的用例的一个简化示例如下:
Mono<Boolean> evaluateValue = fetchValueFromService(id)
.filter(value -> {
if (value != requiredValue) {
id++;
return false;
}
return true;
})
.repeatWhenEmpty(Repeat
.onlyIf(repeatContext -> true)
.fixedBackoff(Duration.ofSeconds(5)));
evaluateValue.subscribe();
但是,这并不能解决问题,因为每次只传递初始值。我想知道这是否是因为Mono是不可变的,无法更改
还有别的办法解决这个问题吗?是否可以动态更新方法(正在重复)使用的参数/参数
谢谢。看看动态生成通量/mono的创建方法 这可以解决你的问题
Mono.create(sink ->
sink.success(fetchValueFromService(id.get()))
)
例如:
AtomicInteger atomicInteger = new AtomicInteger(0);
Mono.create(sink -> sink.success(atomicInteger.getAndIncrement()))
.repeat(10)
.subscribe(System.out::println);
将从0打印到10。使用
Mono.defer()包装fetchValueFromService(id.get())
AtomicInteger atomicInteger = new AtomicInteger(0);
Mono.create(sink -> sink.success(atomicInteger.getAndIncrement()))
.repeat(10)
.subscribe(System.out::println);