Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.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 Mono链的Webflux超时_Java_Spring_Reactive Programming_Spring Webflux_Project Reactor - Fatal编程技术网

Java Mono链的Webflux超时

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) 仅适用于最后一次操作(无操作) ? 我几乎可以肯定超时应用

我正在使用SpringWebFlux并试图理解Monos链的超时概念

例如,有一系列Mono调用:

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完成。