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。因此,最终你会得到想要的行为