1414@ Slf4j
1515class ResilienceCircuitBreakerProvider {
1616
17+ private static final String SHARED_KEY = "SHARED_KEY" ;
1718 private final CircuitBreakerRegistry circuitBreakerRegistry ;
1819 private final Map <String , CircuitBreakerConfig > circuitBreakerConfigMap ;
1920 private final Map <String , CircuitBreaker > circuitBreakerCache = new ConcurrentHashMap <>();
2021 private final List <String > disabledKeys ;
22+ private final boolean defaultEnabled ;
2123
2224 public ResilienceCircuitBreakerProvider (
2325 CircuitBreakerRegistry circuitBreakerRegistry ,
@@ -26,48 +28,72 @@ public ResilienceCircuitBreakerProvider(
2628 this .circuitBreakerRegistry = circuitBreakerRegistry ;
2729 this .circuitBreakerConfigMap = circuitBreakerConfigMap ;
2830 this .disabledKeys = disabledKeys ;
31+ this .defaultEnabled = !disabledKeys .contains (CircuitBreakerConfigParser .DEFAULT_THRESHOLDS );
2932 }
3033
3134 public Optional <CircuitBreaker > getCircuitBreaker (String circuitBreakerKey ) {
32- if (disabledKeys .contains (circuitBreakerKey )
33- || !circuitBreakerConfigMap .containsKey (circuitBreakerKey )) {
35+ if (disabledKeys .contains (circuitBreakerKey )) {
3436 return Optional .empty ();
3537 }
36- return Optional .of (
38+ return Optional .ofNullable (
3739 circuitBreakerCache .computeIfAbsent (
3840 circuitBreakerKey ,
3941 key -> {
40- CircuitBreaker circuitBreaker = getCircuitBreakerFromConfigMap (circuitBreakerKey );
41- circuitBreaker
42- .getEventPublisher ()
43- .onStateTransition (
44- event ->
45- log .info (
46- "State transition: {} for circuit breaker {}" ,
47- event .getStateTransition (),
48- event .getCircuitBreakerName ()))
49- .onCallNotPermitted (
50- event ->
51- log .debug (
52- "Call not permitted: Circuit is OPEN for circuit breaker {}" ,
53- event .getCircuitBreakerName ()))
54- .onEvent (
55- event ->
56- log .debug (
57- "Circuit breaker event type {} for circuit breaker name {}" ,
58- event .getEventType (),
59- event .getCircuitBreakerName ()));
42+ CircuitBreaker circuitBreaker =
43+ getCircuitBreakerFromConfigMap (circuitBreakerKey , defaultEnabled );
44+ // If no circuit breaker is created return empty
45+ if (circuitBreaker == null ) {
46+ return null ; // Ensures cache does not store null entries
47+ }
48+ attachListeners (circuitBreaker );
49+ return circuitBreaker ;
50+ }));
51+ }
52+
53+ public Optional <CircuitBreaker > getSharedCircuitBreaker () {
54+ if (!defaultEnabled ) {
55+ return Optional .empty ();
56+ }
57+ return Optional .of (
58+ circuitBreakerCache .computeIfAbsent (
59+ SHARED_KEY ,
60+ key -> {
61+ CircuitBreaker circuitBreaker = circuitBreakerRegistry .circuitBreaker (SHARED_KEY );
62+ attachListeners (circuitBreaker );
6063 return circuitBreaker ;
6164 }));
6265 }
6366
64- public Optional <CircuitBreaker > getDefaultCircuitBreaker () {
65- return getCircuitBreaker (CircuitBreakerConfigParser .DEFAULT_THRESHOLDS );
67+ private static void attachListeners (CircuitBreaker circuitBreaker ) {
68+ circuitBreaker
69+ .getEventPublisher ()
70+ .onStateTransition (
71+ event ->
72+ log .info (
73+ "State transition: {} for circuit breaker {}" ,
74+ event .getStateTransition (),
75+ event .getCircuitBreakerName ()))
76+ .onCallNotPermitted (
77+ event ->
78+ log .debug (
79+ "Call not permitted: Circuit is OPEN for circuit breaker {}" ,
80+ event .getCircuitBreakerName ()))
81+ .onEvent (
82+ event ->
83+ log .debug (
84+ "Circuit breaker event type {} for circuit breaker name {}" ,
85+ event .getEventType (),
86+ event .getCircuitBreakerName ()));
6687 }
6788
68- private CircuitBreaker getCircuitBreakerFromConfigMap (String circuitBreakerKey ) {
89+ private CircuitBreaker getCircuitBreakerFromConfigMap (
90+ String circuitBreakerKey , boolean defaultEnabled ) {
6991 return Optional .ofNullable (circuitBreakerConfigMap .get (circuitBreakerKey ))
7092 .map (config -> circuitBreakerRegistry .circuitBreaker (circuitBreakerKey , config ))
71- .orElseGet (() -> circuitBreakerRegistry .circuitBreaker (circuitBreakerKey ));
93+ .orElseGet (
94+ () ->
95+ defaultEnabled
96+ ? circuitBreakerRegistry .circuitBreaker (circuitBreakerKey )
97+ : null ); // Return null if default is disabled
7298 }
7399}
0 commit comments