diff --git a/src/main/java/org/springframework/retry/policy/CircuitBreakerRetryPolicy.java b/src/main/java/org/springframework/retry/policy/CircuitBreakerRetryPolicy.java index d36b9e2..f1d534c 100644 --- a/src/main/java/org/springframework/retry/policy/CircuitBreakerRetryPolicy.java +++ b/src/main/java/org/springframework/retry/policy/CircuitBreakerRetryPolicy.java @@ -152,7 +152,7 @@ public class CircuitBreakerRetryPolicy implements RetryPolicy { retryable = this.policy.canRetry(this.context); } else if (time < this.openWindow) { - if ((Boolean) getAttribute(CIRCUIT_OPEN) == false) { + if (!hasAttribute(CIRCUIT_OPEN) || (Boolean) getAttribute(CIRCUIT_OPEN) == false) { logger.trace("Opening circuit"); setAttribute(CIRCUIT_OPEN, true); } diff --git a/src/test/java/org/springframework/retry/policy/CircuitBreakerRetryTemplateTests.java b/src/test/java/org/springframework/retry/policy/CircuitBreakerRetryTemplateTests.java index 43e7cb4..22145bc 100644 --- a/src/test/java/org/springframework/retry/policy/CircuitBreakerRetryTemplateTests.java +++ b/src/test/java/org/springframework/retry/policy/CircuitBreakerRetryTemplateTests.java @@ -147,6 +147,17 @@ public class CircuitBreakerRetryTemplateTests { assertEquals(RESULT, result); } + @Test + public void testCircuitOpensWhenRetryPolicyFirstTimeAttributeCircuitOpenNull() throws Throwable { + MockNeverRetryPolicy mockNeverRetryPolicy = new MockNeverRetryPolicy(); + this.retryTemplate.setRetryPolicy(new CircuitBreakerRetryPolicy(mockNeverRetryPolicy)); + this.callback.setAttemptsBeforeSuccess(10); + Object result = this.retryTemplate.execute(this.callback, this.recovery, this.state); + assertEquals(RECOVERED, result); + result = this.retryTemplate.execute(this.callback, this.recovery, this.state); + assertEquals(RECOVERED, result); + } + protected static class MockRetryCallback implements RetryCallback { private int attemptsBeforeSuccess; @@ -185,4 +196,9 @@ public class CircuitBreakerRetryTemplateTests { } + protected class MockNeverRetryPolicy extends NeverRetryPolicy { + public boolean canRetry(RetryContext context) { + return false; + } + } }