Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/327.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 如何使用Project Reactor使用动态值重复或重试?_Java_Reactive Programming_Repeat_Project Reactor - Fatal编程技术网

Java 如何使用Project Reactor使用动态值重复或重试?

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) {

我有一个方法,它进行服务调用并以Mono的形式返回一个值。在得到所需的值之前,我必须重复执行此方法,并进行一些退避

我正试图使用ProjectReactor的
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);