繁体   English   中英

使用重试策略时 Uni 订阅未运行

[英]Uni subscription not running when using retry policy

我在 Quarkus 上使用 Mutiny 时遇到了一些奇怪的行为。

我的问题是我试图将现有方法包装到 Uni 中,并且我希望此方法重试一定次数,如果它们都失败,我希望调用我的失败订阅,但事实并非如此。

为了更好地理解这一点,我为它写了一个测试:

@Test
void mutinySubscriptionNotCalledAfterRetry() {
    final AtomicBoolean executed = new AtomicBoolean(false);
    Uni.createFrom().item(this::error)
       .onFailure()
       .retry()
       .withBackOff(Duration.ofSeconds(1)).withJitter(0.2)
       .atMost(5)
       .subscribe()
       .with(success -> fail(),
             failure -> executed.set(true));
    assertTrue(executed.get()); // Failing statement
}

private boolean error() {
    throw new RuntimeException();
}

问题是失败订阅从未运行过,我不知道我是否没有理解某些东西,但是根据 Clement 的操场,这似乎是一个有效的用例:

https://gist.github.com/cescoffier/e9abce907a1c3d05d70bea3dae6dc3d5

任何人都可以对此有所了解吗?

非常感谢。

用例完全有效,但您的测试未正确编写。 这种类型的重试是异步的。 因此,执行断言时尚未调用失败回调( failure -> execute(set(true)); )。 你需要等到它被调用。 在您的情况下,大约需要 35 秒。

要等待,您可以使用Awaitility并执行以下操作: await().until(() -> executed.get()); execution.get await().until(() -> executed.get()); . 您还可以使用io.smallrye.mutiny.helpers.test.UniAssertSubscriber

@Test
void mutinySubscriptionNotCalledAfterRetry() {
  UniAssertSubscriber<Boolean> subscriber = 
    Uni.createFrom().item(this::error)              
       .onFailure().retry()
          .withBackOff(Duration.ofSeconds(1)).withJitter(0.2)
          .atMost(5)
       .subscribe().withSubscriber(new UniAssertSubscriber<>());

  subscriber.awaitFailure(Duration.ofSeconds(35));
}

private boolean error() {
    throw new RuntimeException("boom");
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM