发生故障时重试逻辑 - Spring Reactor

时间:2017-05-10 04:39:16

标签: spring project-reactor

我如何进行单元测试RetryWhen,

 public Mono<List<Transaction>> get(String id) {
            return class
                    .get(id).log()
                 .retryWhen(throwableFlux -> throwableFlux) 
                .zipWith(Flux.range(min, max + 1), (error, retry) -> new RetryException(error, retry))
                .flatMap(retryException -> {
                    if(retryException.getRetries() == max + 1) {
                        throw Exceptions.propagate(retryException.getThrowable());
                    } else if (isClientException(retryException.getThrowable())){
                        return Flux.empty();
                    }
                    return Mono.delay(Duration.ofMinutes( new Double(multiplier * retryException.getRetries()).longValue()));
                }));
        }

如何使用StepVerifier测试此方法?

实现重试逻辑的另一种方法,

throwableFlux.takeWhile(throwable -> !isClientException(throwable))
            .flatMap(e -> {
                if(count.get() >= max + 1) {
                    throw Exceptions.propagate(e);
                }
                LOG.info("Retrying in..");
                return Mono.delay(Duration.ofMinutes(new Double(multiplier * count.getAndAdd(1)).longValue()));
            });

2 个答案:

答案 0 :(得分:0)

您的意思是测试通过RetryHelper申请的retryWhen吗?

您当然可以使用StepVerifier来测试这样的重试,包含序列,是的。您还可以在AtomicLong之前使用与doOnSubscribe耦合的retryWhen来检查(重新)订阅的数量(它将帮助断言对正在重试的源的订阅数量) )。

请注意,我们刚刚为retryWhenrepeatWhen添加了这样的构建器实用程序,但是在reactor-extra project(目前在3.1.0.BUILD-SNAPSHOT中)

答案 1 :(得分:0)

这就是我能够测试此代码的方式。

FirstStep.expectSubscription().expectNoEvent(java.time.Duration.ofMinutes(1)).expectNoEvent(Duration.ofMinutes(3)).verifyError()
  

我们可以使用上面的thenAwait(Duration.ofDays(1)),但是   expectNoEvent的好处是保证什么都不会发生   它之前应该有。

     

http://projectreactor.io/docs/core/snapshot/reference/docs/index.html#error.handling