@Test public void waitIntervalOverTenMillisShouldSucceed() { RetryConfig config = RetryConfig.custom().waitDuration(Duration.ofSeconds(10)).build(); Assertions.assertThat(config).isNotNull(); }
public RetryImpl(String name, RetryConfig config){ this.name = name; this.config = config; this.maxAttempts = config.getMaxAttempts(); this.intervalFunction = config.getIntervalFunction(); this.exceptionPredicate = config.getExceptionPredicate(); this.resultPredicate = config.getResultPredicate(); this.metrics = this.new RetryMetrics(); this.eventProcessor = new RetryEventProcessor(); succeededAfterRetryCounter = new LongAdder(); failedAfterRetryCounter = new LongAdder(); succeededWithoutRetryCounter = new LongAdder(); failedWithoutRetryCounter = new LongAdder(); }
/** * The constructor with default retry properties. */ public InMemoryRetryRegistry() { this.defaultRetryConfig = RetryConfig.ofDefaults(); this.retries = new ConcurrentHashMap<>(); }
@Test() public void shouldBuilderCreateConfigEveryTime() { final RetryConfig.Builder builder = RetryConfig.custom(); builder.maxAttempts(5); final RetryConfig config1 = builder.build(); builder.maxAttempts(3); final RetryConfig config2 = builder.build(); assertThat(config2.getMaxAttempts()).isEqualTo(3); assertThat(config1.getMaxAttempts()).isEqualTo(5); }
@Test() public void shouldUseIgnoreExceptionToBuildPredicate() { RetryConfig retryConfig = RetryConfig.custom() .ignoreExceptions(RuntimeException.class, ExtendsExtendsException.class).build(); final Predicate<? super Throwable> failurePredicate = retryConfig.getExceptionPredicate(); then(failurePredicate.test(new Exception())).isEqualTo(true); // not explicitly excluded then(failurePredicate.test(new ExtendsError())).isEqualTo(true); // not explicitly excluded then(failurePredicate.test(new ExtendsException())).isEqualTo(true); // not explicitly excluded then(failurePredicate.test(new ExtendsException2())).isEqualTo(true); // not explicitly excluded then(failurePredicate.test(new RuntimeException())).isEqualTo(false); // explicitly excluded then(failurePredicate.test(new ExtendsRuntimeException())).isEqualTo(false); // inherits excluded from ExtendsException then(failurePredicate.test(new ExtendsExtendsException())).isEqualTo(false); // explicitly excluded }
@Override public Publisher<T> apply(Flowable<T> upstream) { return Flowable.fromPublisher(downstream -> { SubscriptionArbiter sa = new SubscriptionArbiter(); downstream.onSubscribe(sa); RetrySubscriber<T> repeatSubscriber = new RetrySubscriber<>(downstream, retry.getRetryConfig().getMaxAttempts(), sa, upstream, retry); upstream.subscribe(repeatSubscriber); }); }
public RetryConfig build() { buildExceptionPredicate(); RetryConfig config = new RetryConfig(); config.intervalFunction = intervalFunction; config.maxAttempts = maxAttempts; config.exceptionPredicate = exceptionPredicate; config.resultPredicate = resultPredicate; return config; }
@Test() public void shouldUseRecordExceptionToBuildPredicate() { RetryConfig retryConfig = RetryConfig.custom() .retryExceptions(RuntimeException.class, ExtendsExtendsException.class).build(); final Predicate<? super Throwable> failurePredicate = retryConfig.getExceptionPredicate(); then(failurePredicate.test(new Exception())).isEqualTo(false); // not explicitly included then(failurePredicate.test(new ExtendsError())).isEqualTo(false); // not explicitly included then(failurePredicate.test(new ExtendsException())).isEqualTo(false); // not explicitly included then(failurePredicate.test(new ExtendsException2())).isEqualTo(false); // not explicitly included then(failurePredicate.test(new RuntimeException())).isEqualTo(true); // explicitly included then(failurePredicate.test(new ExtendsRuntimeException())).isEqualTo(true); // inherits included from ExtendsException then(failurePredicate.test(new ExtendsExtendsException())).isEqualTo(true); // explicitly included }
@Override public SingleSource<T> apply(Single<T> upstream) { return Single.fromPublisher(downstream -> { Flowable<T> flowable = upstream.toFlowable(); SubscriptionArbiter sa = new SubscriptionArbiter(); downstream.onSubscribe(sa); RetrySubscriber<T> retrySubscriber = new RetrySubscriber<>(downstream, retry.getRetryConfig().getMaxAttempts(), sa, flowable, retry); flowable.subscribe(retrySubscriber); }); }
@Test public void waitIntervalOfTenMillisShouldSucceed() { RetryConfig config = RetryConfig.custom().waitDuration(Duration.ofMillis(10)).build(); Assertions.assertThat(config).isNotNull(); }
@Test() public void shouldUseIgnoreExceptionOverRecordToBuildPredicate() { RetryConfig retryConfig = RetryConfig.custom() .retryExceptions(RuntimeException.class, ExtendsExtendsException.class) .ignoreExceptions(ExtendsException.class, ExtendsRuntimeException.class) .build(); final Predicate<? super Throwable> failurePredicate = retryConfig.getExceptionPredicate(); then(failurePredicate.test(new Exception())).isEqualTo(false); // not explicitly included then(failurePredicate.test(new ExtendsError())).isEqualTo(false); // not explicitly included then(failurePredicate.test(new ExtendsException())).isEqualTo(false); // explicitly excluded then(failurePredicate.test(new ExtendsException2())).isEqualTo(false); // not explicitly included then(failurePredicate.test(new RuntimeException())).isEqualTo(true); // explicitly included then(failurePredicate.test(new ExtendsRuntimeException())).isEqualTo(false); // explicitly excluded then(failurePredicate.test(new ExtendsExtendsException())).isEqualTo(false); // inherits excluded from ExtendsException }
public AsyncRetryImpl(String name, RetryConfig config) { this.config = config; this.name = name; this.maxAttempts = config.getMaxAttempts(); this.intervalFunction = config.getIntervalFunction(); this.exceptionPredicate = config.getExceptionPredicate(); this.resultPredicate = config.getResultPredicate(); this.metrics = this.new AsyncRetryMetrics(); succeededAfterRetryCounter = new LongAdder(); failedAfterRetryCounter = new LongAdder(); succeededWithoutRetryCounter = new LongAdder(); failedWithoutRetryCounter = new LongAdder(); this.eventProcessor = new RetryEventProcessor(); }
@Override public ObservableSource<T> apply(Observable<T> upstream) { return Observable.fromPublisher(downstream -> { Flowable<T> flowable = upstream.toFlowable(BackpressureStrategy.BUFFER); SubscriptionArbiter sa = new SubscriptionArbiter(); downstream.onSubscribe(sa); RetrySubscriber<T> retrySubscriber = new RetrySubscriber<>(downstream, retry.getRetryConfig().getMaxAttempts(), sa, flowable, retry); flowable.subscribe(retrySubscriber); }); }
/** * The constructor with default retry properties. */ public InMemoryAsyncRetryRegistry() { this.defaultRetryConfig = RetryConfig.ofDefaults(); this.retries = new ConcurrentHashMap<>(); }
@Test(expected = IllegalArgumentException.class) public void zeroWaitIntervalShouldFail() { RetryConfig.custom().waitDuration(Duration.ofMillis(0)).build(); }
@Test() public void shouldUseBothRecordToBuildPredicate() { RetryConfig retryConfig = RetryConfig.custom() .retryOnException(TEST_PREDICATE) //1 .retryExceptions(RuntimeException.class, ExtendsExtendsException.class) //2 .ignoreExceptions(ExtendsException.class, ExtendsRuntimeException.class) //3 .build(); final Predicate<? super Throwable> failurePredicate = retryConfig.getExceptionPredicate(); then(failurePredicate.test(new Exception())).isEqualTo(false); // not explicitly included then(failurePredicate.test(new Exception("test"))).isEqualTo(true); // explicitly included by 1 then(failurePredicate.test(new ExtendsError())).isEqualTo(false); // ot explicitly included then(failurePredicate.test(new ExtendsException())).isEqualTo(false); // explicitly excluded by 3 then(failurePredicate.test(new ExtendsException("test"))).isEqualTo(false); // explicitly excluded by 3 even if included by 1 then(failurePredicate.test(new ExtendsException2())).isEqualTo(false); // not explicitly included then(failurePredicate.test(new RuntimeException())).isEqualTo(true); // explicitly included by 2 then(failurePredicate.test(new ExtendsRuntimeException())).isEqualTo(false); // explicitly excluded by 3 then(failurePredicate.test(new ExtendsExtendsException())).isEqualTo(false); // inherits excluded from ExtendsException by 3 }
@Override public Publisher<T> apply(Flowable<T> upstream) { return Flowable.fromPublisher(downstream -> { SubscriptionArbiter sa = new SubscriptionArbiter(); downstream.onSubscribe(sa); RetrySubscriber<T> repeatSubscriber = new RetrySubscriber<>(downstream, retry.getRetryConfig().getMaxAttempts(), sa, upstream, retry); upstream.subscribe(repeatSubscriber); }); }
/** * Creates a Retry with default configuration. * * @param name the ID of the Retry * @return a Retry with default configuration */ static Retry ofDefaults(String name){ return new RetryImpl(name, RetryConfig.ofDefaults()); }
@Test(expected = IllegalArgumentException.class) public void waitIntervalUnderTenMillisShouldFail() { RetryConfig.custom().waitDuration(Duration.ofMillis(5)).build(); }
@Override public SingleSource<T> apply(Single<T> upstream) { return Single.fromPublisher(downstream -> { Flowable<T> flowable = upstream.toFlowable(); SubscriptionArbiter sa = new SubscriptionArbiter(); downstream.onSubscribe(sa); RetrySubscriber<T> retrySubscriber = new RetrySubscriber<>(downstream, retry.getRetryConfig().getMaxAttempts(), sa, flowable, retry); flowable.subscribe(retrySubscriber); }); }