Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/355.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 反应器重试不调用要重试的方法_Java_Project Reactor - Fatal编程技术网

Java 反应器重试不调用要重试的方法

Java 反应器重试不调用要重试的方法,java,project-reactor,Java,Project Reactor,我有一个方法总是返回Mono.error private Mono<String> doSomething() { System.out.println("doSomething"); return Mono.error(new Error()); } private Mono doSomething(){ 系统输出打印(“剂量测量”); 返回Mono.error(newerror()); } 我尝试了3次重试执行 Mono<String&g

我有一个方法总是返回
Mono.error

private Mono<String> doSomething() {
        System.out.println("doSomething");
        return Mono.error(new Error());
}
private Mono doSomething(){
系统输出打印(“剂量测量”);
返回Mono.error(newerror());
}
我尝试了3次重试执行

Mono<String> mono =
                myClass.doSomething()
                        .doOnSubscribe(x -> System.out.println("Subscribe"))
                        .retryWhen(companion -> companion
                                .doOnNext(s -> System.out.println(s + " at " + LocalTime.now()))
                                .zipWith(Flux.range(1, 4), (error, index) -> {
                                    if (index < 4) return index;
                                    else throw Exceptions.propagate(error);
                                })
                                .flatMap(index -> Mono.delay(Duration.ofMillis(index * 100)))
                                .doOnNext(s -> System.out.println("retried at " + LocalTime.now()))
                        );

        mono.block();
Mono=
myClass.doSomething()
.doOnSubscribe(x->System.out.println(“订阅”))
.retryWhen(同伴->同伴)
.doOnNext(s->System.out.println(s+“在”+LocalTime.now()处)
.zipWith(通量范围(1,4),(误差,索引)->{
if(指数<4)返回指数;
else抛出异常。传播(错误);
})
.flatMap(索引->单声道延迟(持续时间百万(索引*100)))
.doOnNext(s->System.out.println(“在“+LocalTime.now()处重试”)
);
mono.block();
但是,
doSomething
只打印一次,而
Subscribe
打印4次(开始时打印1次,重试3次)

如果不执行该方法,它如何重新订阅

我想做的是在每次重试时执行
doSomething

doSomething()
只调用过一次-也就是说,由您显式地检索基于错误的
Mono
。返回的
Mono
确实会在每次重试时再次订阅,但最初返回它的方法不会再次调用

这里最好的做法是重构代码,以便在订阅
Mono
时发生任何副作用,例如:

private Mono<String> doSomething() {
    return Mono.<String>error(new Error()).doOnSubscribe(s -> System.out.println("doSomething"));
}
…与:

Mono.fromSupplier(myClass::doSomething).flatMap(p->p)
doSomething()
只被调用一次,也就是说,由您显式地检索基于错误的
Mono
。返回的
Mono
确实会在每次重试时再次订阅,但最初返回它的方法不会再次调用

这里最好的做法是重构代码,以便在订阅
Mono
时发生任何副作用,例如:

private Mono<String> doSomething() {
    return Mono.<String>error(new Error()).doOnSubscribe(s -> System.out.println("doSomething"));
}
…与:

Mono.fromSupplier(myClass::doSomething).flatMap(p->p)

要在每次重试时执行
doSomething
,可以将运算符与以下组合使用:


基本上,操作符通过重新订阅
Mono
源来工作,并且操作符在每次有新订阅时重新评估lambda。因此,最终您将获得所需的行为。

要在每次重试时执行
doSomething
,您可以将运算符与以下组合使用:

基本上,操作符通过重新订阅
Mono
源来工作,并且操作符在每次有新订阅时重新评估lambda。因此,最终你会得到想要的行为