diff --git a/src/main/java/org/springframework/retry/policy/CompositeRetryPolicy.java b/src/main/java/org/springframework/retry/policy/CompositeRetryPolicy.java index 294944f..6089b4c 100644 --- a/src/main/java/org/springframework/retry/policy/CompositeRetryPolicy.java +++ b/src/main/java/org/springframework/retry/policy/CompositeRetryPolicy.java @@ -27,13 +27,24 @@ import org.springframework.retry.context.RetryContextSupport; /** * A {@link RetryPolicy} that composes a list of other policies and delegates * calls to them in order. - * + * * @author Dave Syer - * + * @author Michael Minella + * */ public class CompositeRetryPolicy implements RetryPolicy { RetryPolicy[] policies = new RetryPolicy[0]; + private boolean optimistic = false; + + /** + * Setter for optimistic. + * + * @param optimistic + */ + public void setOptimistic(boolean optimistic) { + this.optimistic = optimistic; + } /** * Setter for policies. @@ -54,12 +65,26 @@ public class CompositeRetryPolicy implements RetryPolicy { public boolean canRetry(RetryContext context) { RetryContext[] contexts = ((CompositeRetryContext) context).contexts; RetryPolicy[] policies = ((CompositeRetryContext) context).policies; - for (int i = 0; i < contexts.length; i++) { - if (!policies[i].canRetry(contexts[i])) { - return false; + + boolean retryable = true; + + if(optimistic) { + retryable = false; + for (int i = 0; i < contexts.length; i++) { + if (policies[i].canRetry(contexts[i])) { + retryable = true; + } } } - return true; + else { + for (int i = 0; i < contexts.length; i++) { + if (!policies[i].canRetry(contexts[i])) { + retryable = false; + } + } + } + + return retryable; } /** diff --git a/src/test/java/org/springframework/retry/policy/CompositeRetryPolicyTests.java b/src/test/java/org/springframework/retry/policy/CompositeRetryPolicyTests.java index 1fbb6ac..669489e 100644 --- a/src/test/java/org/springframework/retry/policy/CompositeRetryPolicyTests.java +++ b/src/test/java/org/springframework/retry/policy/CompositeRetryPolicyTests.java @@ -135,4 +135,16 @@ public class CompositeRetryPolicyTests extends TestCase { assertSame(context, child.getParent()); } + public void testOptimistic() throws Exception { + CompositeRetryPolicy policy = new CompositeRetryPolicy(); + policy.setOptimistic(true); + policy.setPolicies(new RetryPolicy[] { new MockRetryPolicySupport() { + public boolean canRetry(RetryContext context) { + return false; + } + }, new MockRetryPolicySupport() }); + RetryContext context = policy.open(null); + assertNotNull(context); + assertTrue(policy.canRetry(context)); + } }