Skip to content

Commit

Permalink
Issue ReactiveX#309: Added fallback functionality to spring annotatio…
Browse files Browse the repository at this point in the history
  • Loading branch information
lespinsideg authored and RobWin committed May 8, 2019
1 parent a6da58b commit c679135
Show file tree
Hide file tree
Showing 63 changed files with 1,759 additions and 77 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -12,4 +12,11 @@
* @return the name of the bulkhead
*/
String name();

/**
* recovery method name.
*
* @return recovery method name.
*/
String recovery() default "";
}
Original file line number Diff line number Diff line change
Expand Up @@ -39,4 +39,11 @@
* @return the name of the circuit breaker
*/
String name();

/**
* recovery method name.
*
* @return recovery method name.
*/
String recovery() default "";
}
Original file line number Diff line number Diff line change
Expand Up @@ -38,4 +38,11 @@
* @return the name of the limiter
*/
String name();

/**
* recovery method name.
*
* @return recovery method name.
*/
String recovery() default "";
}
Original file line number Diff line number Diff line change
Expand Up @@ -38,4 +38,11 @@
* @return the name of the sync retry.
*/
String name();

/**
* recovery method name.
*
* @return recovery method name.
*/
String recovery() default "";
}
Original file line number Diff line number Diff line change
Expand Up @@ -19,13 +19,16 @@
import io.github.resilience4j.bulkhead.configure.*;
import io.github.resilience4j.bulkhead.event.BulkheadEvent;
import io.github.resilience4j.consumer.EventConsumerRegistry;
import io.github.resilience4j.recovery.RecoveryDecorators;
import io.github.resilience4j.recovery.autoconfigure.RecoveryConfigurationOnMissingBean;
import io.github.resilience4j.utils.ReactorOnClasspathCondition;
import io.github.resilience4j.utils.RxJava2OnClasspathCondition;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Conditional;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;

import java.util.List;

Expand All @@ -34,6 +37,7 @@
* Configuration} for resilience4j-bulkhead.
*/
@Configuration
@Import(RecoveryConfigurationOnMissingBean.class)
public abstract class AbstractBulkheadConfigurationOnMissingBean {

protected final BulkheadConfiguration bulkheadConfiguration;
Expand All @@ -52,8 +56,9 @@ public BulkheadRegistry bulkheadRegistry(BulkheadConfigurationProperties bulkhea
@Bean
@ConditionalOnMissingBean
public BulkheadAspect bulkheadAspect(BulkheadConfigurationProperties bulkheadConfigurationProperties,
BulkheadRegistry bulkheadRegistry, @Autowired(required = false) List<BulkheadAspectExt> bulkHeadAspectExtList) {
return bulkheadConfiguration.bulkheadAspect(bulkheadConfigurationProperties, bulkheadRegistry, bulkHeadAspectExtList);
BulkheadRegistry bulkheadRegistry, @Autowired(required = false) List<BulkheadAspectExt> bulkHeadAspectExtList,
RecoveryDecorators recoveryDecorators) {
return bulkheadConfiguration.bulkheadAspect(bulkheadConfigurationProperties, bulkheadRegistry, bulkHeadAspectExtList, recoveryDecorators);
}

@Bean
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,17 +20,21 @@
import io.github.resilience4j.circuitbreaker.configure.*;
import io.github.resilience4j.circuitbreaker.event.CircuitBreakerEvent;
import io.github.resilience4j.consumer.EventConsumerRegistry;
import io.github.resilience4j.recovery.RecoveryDecorators;
import io.github.resilience4j.recovery.autoconfigure.RecoveryConfigurationOnMissingBean;
import io.github.resilience4j.utils.ReactorOnClasspathCondition;
import io.github.resilience4j.utils.RxJava2OnClasspathCondition;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Conditional;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;

import java.util.List;

@Configuration
@Import(RecoveryConfigurationOnMissingBean.class)
public abstract class AbstractCircuitBreakerConfigurationOnMissingBean {

protected final CircuitBreakerConfiguration circuitBreakerConfiguration;
Expand Down Expand Up @@ -64,8 +68,9 @@ public CircuitBreakerRegistry circuitBreakerRegistry(EventConsumerRegistry<Circu
@Bean
@ConditionalOnMissingBean
public CircuitBreakerAspect circuitBreakerAspect(CircuitBreakerRegistry circuitBreakerRegistry,
@Autowired(required = false) List<CircuitBreakerAspectExt> circuitBreakerAspectExtList) {
return circuitBreakerConfiguration.circuitBreakerAspect(circuitBreakerRegistry, circuitBreakerAspectExtList);
@Autowired(required = false) List<CircuitBreakerAspectExt> circuitBreakerAspectExtList,
RecoveryDecorators recoveryDecorators) {
return circuitBreakerConfiguration.circuitBreakerAspect(circuitBreakerRegistry, circuitBreakerAspectExtList, recoveryDecorators);
}

@Bean
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,17 +19,21 @@
import io.github.resilience4j.ratelimiter.RateLimiterRegistry;
import io.github.resilience4j.ratelimiter.configure.*;
import io.github.resilience4j.ratelimiter.event.RateLimiterEvent;
import io.github.resilience4j.recovery.RecoveryDecorators;
import io.github.resilience4j.recovery.autoconfigure.RecoveryConfigurationOnMissingBean;
import io.github.resilience4j.utils.ReactorOnClasspathCondition;
import io.github.resilience4j.utils.RxJava2OnClasspathCondition;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Conditional;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;

import java.util.List;

@Configuration
@Import(RecoveryConfigurationOnMissingBean.class)
public abstract class AbstractRateLimiterConfigurationOnMissingBean {
protected final RateLimiterConfiguration rateLimiterConfiguration;

Expand All @@ -46,8 +50,8 @@ public RateLimiterRegistry rateLimiterRegistry(RateLimiterConfigurationPropertie

@Bean
@ConditionalOnMissingBean
public RateLimiterAspect rateLimiterAspect(RateLimiterConfigurationProperties rateLimiterProperties, RateLimiterRegistry rateLimiterRegistry, @Autowired(required = false) List<RateLimiterAspectExt> rateLimiterAspectExtList) {
return rateLimiterConfiguration.rateLimiterAspect(rateLimiterProperties, rateLimiterRegistry, rateLimiterAspectExtList);
public RateLimiterAspect rateLimiterAspect(RateLimiterConfigurationProperties rateLimiterProperties, RateLimiterRegistry rateLimiterRegistry, @Autowired(required = false) List<RateLimiterAspectExt> rateLimiterAspectExtList, RecoveryDecorators recoveryDecorators) {
return rateLimiterConfiguration.rateLimiterAspect(rateLimiterProperties, rateLimiterRegistry, rateLimiterAspectExtList, recoveryDecorators);
}

@Bean
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
/*
* Copyright 2019 Kyuhyen Hwang
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package io.github.resilience4j.recovery.autoconfigure;

import io.github.resilience4j.recovery.RecoveryDecorator;
import io.github.resilience4j.recovery.RecoveryDecorators;
import io.github.resilience4j.recovery.configure.RecoveryConfiguration;
import io.github.resilience4j.utils.ReactorOnClasspathCondition;
import io.github.resilience4j.utils.RxJava2OnClasspathCondition;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Conditional;
import org.springframework.context.annotation.Configuration;

import java.util.List;

/**
* {@link Configuration} for {@link RecoveryDecorators}.
*/
@Configuration
public class RecoveryConfigurationOnMissingBean {
private final RecoveryConfiguration recoveryConfiguration;

public RecoveryConfigurationOnMissingBean() {
this.recoveryConfiguration = new RecoveryConfiguration();
}

@Bean
@ConditionalOnMissingBean
public RecoveryDecorators recoveryDecorators(List<RecoveryDecorator> recoveryDecorator) {
return recoveryConfiguration.recoveryDecorators(recoveryDecorator);
}

@Bean
@Conditional(value = {RxJava2OnClasspathCondition.class})
@ConditionalOnMissingBean
public RecoveryDecorator rxJava2RecoveryDecorator() {
return recoveryConfiguration.rxJava2RecoveryDecorator();
}

@Bean
@Conditional(value = {ReactorOnClasspathCondition.class})
@ConditionalOnMissingBean
public RecoveryDecorator reactorRecoveryDecorator() {
return recoveryConfiguration.reactorRecoveryDecorator();
}

@Bean
@ConditionalOnMissingBean
public RecoveryDecorator completionStageRecoveryDecorator() {
return recoveryConfiguration.completionStageRecoveryDecorator();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@
package io.github.resilience4j.retry.autoconfigure;

import io.github.resilience4j.consumer.EventConsumerRegistry;
import io.github.resilience4j.recovery.RecoveryDecorators;
import io.github.resilience4j.recovery.autoconfigure.RecoveryConfigurationOnMissingBean;
import io.github.resilience4j.retry.RetryRegistry;
import io.github.resilience4j.retry.configure.*;
import io.github.resilience4j.retry.event.RetryEvent;
Expand All @@ -26,6 +28,7 @@
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Conditional;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;

import java.util.List;

Expand All @@ -34,6 +37,7 @@
* Configuration} for resilience4j-retry.
*/
@Configuration
@Import(RecoveryConfigurationOnMissingBean.class)
public abstract class AbstractRetryConfigurationOnMissingBean {

protected final RetryConfiguration retryConfiguration;
Expand Down Expand Up @@ -61,8 +65,9 @@ public RetryRegistry retryRegistry(RetryConfigurationProperties retryConfigurati
@Bean
@ConditionalOnMissingBean
public RetryAspect retryAspect(RetryConfigurationProperties retryConfigurationProperties,
RetryRegistry retryRegistry, @Autowired(required = false) List<RetryAspectExt> retryAspectExtList) {
return retryConfiguration.retryAspect(retryConfigurationProperties, retryRegistry, retryAspectExtList);
RetryRegistry retryRegistry, @Autowired(required = false) List<RetryAspectExt> retryAspectExtList,
RecoveryDecorators recoveryDecorators) {
return retryConfiguration.retryAspect(retryConfigurationProperties, retryRegistry, retryAspectExtList, recoveryDecorators);
}

@Bean
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,8 @@
import io.github.resilience4j.consumer.DefaultEventConsumerRegistry;
import io.github.resilience4j.ratelimiter.RateLimiterRegistry;
import io.github.resilience4j.ratelimiter.configure.RateLimiterConfigurationProperties;
import io.github.resilience4j.recovery.CompletionStageRecoveryDecorator;
import io.github.resilience4j.recovery.RecoveryDecorators;
import io.github.resilience4j.retry.RetryRegistry;
import io.github.resilience4j.retry.configure.RetryConfigurationProperties;
import io.github.resilience4j.bulkhead.autoconfigure.AbstractBulkheadConfigurationOnMissingBean;
Expand All @@ -31,6 +33,7 @@
import io.github.resilience4j.retry.autoconfigure.AbstractRetryConfigurationOnMissingBean;
import org.junit.Test;

import java.util.Arrays;
import java.util.Collections;

import static org.assertj.core.api.AssertionsForClassTypes.assertThat;
Expand All @@ -46,7 +49,7 @@ public void testBulkHeadCommonConfig() {
assertThat(bulkheadConfigurationOnMissingBean.bulkheadRegistry(new BulkheadConfigurationProperties(), new DefaultEventConsumerRegistry<>())).isNotNull();
assertThat(bulkheadConfigurationOnMissingBean.reactorBulkHeadAspectExt()).isNotNull();
assertThat(bulkheadConfigurationOnMissingBean.rxJava2BulkHeadAspectExt()).isNotNull();
assertThat(bulkheadConfigurationOnMissingBean.bulkheadAspect(new BulkheadConfigurationProperties(), BulkheadRegistry.ofDefaults(), Collections.emptyList()));
assertThat(bulkheadConfigurationOnMissingBean.bulkheadAspect(new BulkheadConfigurationProperties(), BulkheadRegistry.ofDefaults(), Collections.emptyList(), new RecoveryDecorators(Arrays.asList(new CompletionStageRecoveryDecorator()))));
}

@Test
Expand All @@ -55,7 +58,7 @@ public void testCircuitBreakerCommonConfig() {
assertThat(circuitBreakerConfig.reactorCircuitBreakerAspect()).isNotNull();
assertThat(circuitBreakerConfig.rxJava2CircuitBreakerAspect()).isNotNull();
assertThat(circuitBreakerConfig.circuitBreakerRegistry(new DefaultEventConsumerRegistry<>())).isNotNull();
assertThat(circuitBreakerConfig.circuitBreakerAspect(CircuitBreakerRegistry.ofDefaults(), Collections.emptyList()));
assertThat(circuitBreakerConfig.circuitBreakerAspect(CircuitBreakerRegistry.ofDefaults(), Collections.emptyList(), new RecoveryDecorators(Arrays.asList(new CompletionStageRecoveryDecorator()))));
}

@Test
Expand All @@ -64,7 +67,7 @@ public void testRetryCommonConfig() {
assertThat(retryConfigurationOnMissingBean.reactorRetryAspectExt()).isNotNull();
assertThat(retryConfigurationOnMissingBean.rxJava2RetryAspectExt()).isNotNull();
assertThat(retryConfigurationOnMissingBean.retryRegistry(new RetryConfigurationProperties(), new DefaultEventConsumerRegistry<>())).isNotNull();
assertThat(retryConfigurationOnMissingBean.retryAspect(new RetryConfigurationProperties(), RetryRegistry.ofDefaults(), Collections.emptyList()));
assertThat(retryConfigurationOnMissingBean.retryAspect(new RetryConfigurationProperties(), RetryRegistry.ofDefaults(), Collections.emptyList(), new RecoveryDecorators(Arrays.asList(new CompletionStageRecoveryDecorator()))));
}

@Test
Expand All @@ -73,7 +76,7 @@ public void testRateLimiterCommonConfig() {
assertThat(rateLimiterConfigurationOnMissingBean.reactorRateLimiterAspectExt()).isNotNull();
assertThat(rateLimiterConfigurationOnMissingBean.rxJava2RateLimterAspectExt()).isNotNull();
assertThat(rateLimiterConfigurationOnMissingBean.rateLimiterRegistry(new RateLimiterConfigurationProperties(), new DefaultEventConsumerRegistry<>())).isNotNull();
assertThat(rateLimiterConfigurationOnMissingBean.rateLimiterAspect(new RateLimiterConfigurationProperties(), RateLimiterRegistry.ofDefaults(), Collections.emptyList()));
assertThat(rateLimiterConfigurationOnMissingBean.rateLimiterAspect(new RateLimiterConfigurationProperties(), RateLimiterRegistry.ofDefaults(), Collections.emptyList(), new RecoveryDecorators(Arrays.asList(new CompletionStageRecoveryDecorator()))));
}


Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
import java.lang.reflect.Method;
import java.util.List;

import io.github.resilience4j.recovery.RecoveryDecorators;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
Expand Down Expand Up @@ -104,8 +105,9 @@ public BulkheadRegistry bulkheadRegistry() {

@Bean
public BulkheadAspect bulkheadAspect(BulkheadRegistry bulkheadRegistry,
@Autowired(required = false) List<BulkheadAspectExt> bulkheadAspectExts) {
bulkheadAspect = new BulkheadAspect(new BulkheadProperties(), bulkheadRegistry, bulkheadAspectExts);
@Autowired(required = false) List<BulkheadAspectExt> bulkheadAspectExts,
RecoveryDecorators recoveryDecorators) {
bulkheadAspect = new BulkheadAspect(new BulkheadProperties(), bulkheadRegistry, bulkheadAspectExts, recoveryDecorators);
return bulkheadAspect;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
import java.lang.reflect.Method;
import java.util.List;

import io.github.resilience4j.recovery.RecoveryDecorators;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
Expand Down Expand Up @@ -104,8 +105,9 @@ public CircuitBreakerRegistry circuitBreakerRegistry() {

@Bean
public CircuitBreakerAspect circuitBreakerAspect(CircuitBreakerRegistry circuitBreakerRegistry,
@Autowired(required = false) List<CircuitBreakerAspectExt> circuitBreakerAspectExtList) {
circuitBreakerAspect = new CircuitBreakerAspect(new CircuitBreakerProperties(), circuitBreakerRegistry, circuitBreakerAspectExtList);
@Autowired(required = false) List<CircuitBreakerAspectExt> circuitBreakerAspectExtList,
RecoveryDecorators recoveryDecorators) {
circuitBreakerAspect = new CircuitBreakerAspect(new CircuitBreakerProperties(), circuitBreakerRegistry, circuitBreakerAspectExtList, recoveryDecorators);
return circuitBreakerAspect;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
import java.lang.reflect.Method;
import java.util.List;

import io.github.resilience4j.recovery.RecoveryDecorators;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
Expand Down Expand Up @@ -105,8 +106,8 @@ public RateLimiterRegistry rateLimiterRegistry() {
}

@Bean
public RateLimiterAspect rateLimiterAspect(RateLimiterRegistry rateLimiterRegistry, @Autowired(required = false) List<RateLimiterAspectExt> rateLimiterAspectExtList) {
rateLimiterAspect = new RateLimiterAspect(rateLimiterRegistry, new RateLimiterConfigurationProperties(), rateLimiterAspectExtList);
public RateLimiterAspect rateLimiterAspect(RateLimiterRegistry rateLimiterRegistry, @Autowired(required = false) List<RateLimiterAspectExt> rateLimiterAspectExtList, RecoveryDecorators recoveryDecorators) {
rateLimiterAspect = new RateLimiterAspect(rateLimiterRegistry, new RateLimiterConfigurationProperties(), rateLimiterAspectExtList, recoveryDecorators);
return rateLimiterAspect;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
import java.lang.reflect.Method;
import java.util.List;

import io.github.resilience4j.recovery.RecoveryDecorators;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
Expand Down Expand Up @@ -104,8 +105,9 @@ public RetryRegistry retryRegistry() {

@Bean
public RetryAspect retryAspect(RetryRegistry retryRegistry,
@Autowired(required = false) List<RetryAspectExt> retryAspectExts) {
this.retryAspect = new RetryAspect(new RetryProperties(), retryRegistry, retryAspectExts);
@Autowired(required = false) List<RetryAspectExt> retryAspectExts,
RecoveryDecorators recoveryDecorators) {
this.retryAspect = new RetryAspect(new RetryProperties(), retryRegistry, retryAspectExts, recoveryDecorators);
return retryAspect;
}

Expand Down
Loading

0 comments on commit c679135

Please sign in to comment.