Java Mono链的Webflux超时
我正在使用SpringWebFlux并试图理解Monos链的超时概念 例如,有一系列Mono调用:Java Mono链的Webflux超时,java,spring,reactive-programming,spring-webflux,project-reactor,Java,Spring,Reactive Programming,Spring Webflux,Project Reactor,我正在使用SpringWebFlux并试图理解Monos链的超时概念 例如,有一系列Mono调用: myService.firstOperation() .then(myService.secondOperation()) ... .then(myService.nOperation()) .timeout(3000L) 如何应用超时: 1) 对于一般操作(操作的总时间) 2) 对于ech操作(每个操作所需时间不得超过超时时间) 3) 仅适用于最后一次操作(无操作) ? 我几乎可以肯定超时应用
myService.firstOperation()
.then(myService.secondOperation())
...
.then(myService.nOperation())
.timeout(3000L)
如何应用超时:
1) 对于一般操作(操作的总时间)
2) 对于ech操作(每个操作所需时间不得超过超时时间)
3) 仅适用于最后一次操作(无操作)
?
我几乎可以肯定超时应用于最后一个发布服务器。如果是这样,如何将超时应用于操作的总和?文档非常清楚 timeout(超时)此单声道发出下一个信号之前的超时 因此,在您的示例中,超时仅应用于从上一次
然后
返回的Mono
.then( ... )
.timeout(3000L)
正确答案是:
3) 仅适用于最后一次操作(无操作)
因为这是链条中的最后一个
操作总和没有超时,为什么需要超时?超时运算符测量订阅时间与超时运算符观察到的onNext/onComplete信号之间的经过时间 考虑以下示例:
Mono.延迟(持续时间单位:百万(1000))
.然后(单声道延迟(持续时间为1000毫秒)
.然后(单声道延迟(持续时间为1000毫秒)
.超时(持续时间.百万(2500))
.block();
如果语句2(操作之间测量的时间)或3(仅上次操作计数的持续时间)正确,则上述代码不会抛出任何错误
然而,情况是超时操作测量所有上游操作的持续时间,这使得语句1(测量的所有操作的总和)正确
在本例中,所有操作的总和(1000+1000+1000=3000ms)大于配置的超时(2500ms),因此代码会导致错误。谢谢,我们的想法是,在达到超时后,N个阶段的长过程应该终止。我可以将它包装到一个方法中并对其应用超时,但在我的例子中,它看起来很脏。public void test(){Mono.fromRunnable(()->run(1))。然后(Mono.fromRunnable(()->run(2))。然后(Mono.fromRunnable(()->run(3))。超时(持续时间:1500)//将执行阶段2,阶段3-not.block();}私有无效运行(inti){try{System.out.println(“运行阶段”+i);Thread.sleep(1000);System.out.println(“运行阶段”+i+“完成”);}捕获(中断异常e){e.printStackTrace();}}你是对的。输出为:运行阶段1运行阶段1完成运行阶段2运行阶段2完成。