【问题标题】:Spring WebFlux : Timeout Handler invoked even when it hasn't timed outSpring WebFlux:即使没有超时,也会调用超时处理程序
【发布时间】:2020-10-09 07:39:25
【问题描述】:

我想了解为什么在下面的代码中调用超时处理程序。因为我已经配置了 100 秒的超时时间,所以我没想到会在 1 秒后发出元素时调用处理程序。

public static void main(String[] args) throws InterruptedException {
    Mono<Integer> integerMono = Mono.just(1).delayElement(Duration.ofSeconds(1));

    integerMono
     .timeout(Duration.ofSeconds(100),handler())
     .subscribe(integer -> System.out.println(integer));

    Thread.sleep(10000);
  }

  private static Mono<? extends Integer> handler() {
    System.out.println("handler invoked");
    return Mono.just(10);
  }

下面是输出:

handler invoked
1

有人可以解释一下,为什么会这样,以及我们如何实现预期的行为?

【问题讨论】:

标签: java project-reactor


【解决方案1】:

您的handler() 方法在您每次调用时都会被调用。这是一个创建Mono 对象的简单Java 方法。但是这个Mono只有在超时后才会被订阅。

您可以像这样更改您的处理程序方法来测试它:

private Mono<? extends Integer> handler() {
    System.out.println("Handler assembling");
    return Mono.just(10)
            .doOnSubscribe(subscription ->
                    System.out.println("Handler subscribed"));
}

有一个blog post关于组装和订阅的差异。

That SO answer 也会有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-13
    • 1970-01-01
    • 2019-10-21
    • 1970-01-01
    • 2015-09-13
    • 2012-09-16
    • 2021-11-23
    • 2019-08-16
    相关资源
    最近更新 更多