This is an automated email from the ASF dual-hosted git repository. ningjiang pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/servicecomb-saga.git
The following commit(s) were added to refs/heads/master by this push: new 08ad149 SCB-1039 Add a check for the compensable retires setting 08ad149 is described below commit 08ad1497a00559f5bff9619d85700a3bec8f4977 Author: Willem Jiang <jiangni...@huawei.com> AuthorDate: Fri Nov 23 15:17:07 2018 +0800 SCB-1039 Add a check for the compensable retires setting --- .../spring/CompensableMethodCheckingCallback.java | 7 ++++++- .../spring/CompensableAnnotationCheckingTest.java | 14 ++++++++++++++ .../spring/MisconfiguredRetriesService.java} | 21 +++++++-------------- .../omega/transaction/annotations/Compensable.java | 10 ++++++++++ 4 files changed, 37 insertions(+), 15 deletions(-) diff --git a/omega/omega-spring-tx/src/main/java/org/apache/servicecomb/saga/omega/transaction/spring/CompensableMethodCheckingCallback.java b/omega/omega-spring-tx/src/main/java/org/apache/servicecomb/saga/omega/transaction/spring/CompensableMethodCheckingCallback.java index e3f4907..bf2b5ce 100644 --- a/omega/omega-spring-tx/src/main/java/org/apache/servicecomb/saga/omega/transaction/spring/CompensableMethodCheckingCallback.java +++ b/omega/omega-spring-tx/src/main/java/org/apache/servicecomb/saga/omega/transaction/spring/CompensableMethodCheckingCallback.java @@ -32,7 +32,12 @@ class CompensableMethodCheckingCallback extends MethodCheckingCallback { if (!method.isAnnotationPresent(Compensable.class)) { return; } - String compensationMethod = method.getAnnotation(Compensable.class).compensationMethod(); + Compensable compensable = method.getAnnotation(Compensable.class); + String compensationMethod = compensable.compensationMethod(); + // we don't support the retries number below -1. + if (compensable.retries() < -1) { + throw new IllegalArgumentException(String.format("Compensable %s of method %s, the retries should not below -1.", compensable, method.getName())); + } loadMethodContext(method, compensationMethod); } } diff --git a/omega/omega-spring-tx/src/test/java/org/apache/servicecomb/saga/omega/transaction/spring/CompensableAnnotationCheckingTest.java b/omega/omega-spring-tx/src/test/java/org/apache/servicecomb/saga/omega/transaction/spring/CompensableAnnotationCheckingTest.java index 0bf6dce..6cbf8f9 100644 --- a/omega/omega-spring-tx/src/test/java/org/apache/servicecomb/saga/omega/transaction/spring/CompensableAnnotationCheckingTest.java +++ b/omega/omega-spring-tx/src/test/java/org/apache/servicecomb/saga/omega/transaction/spring/CompensableAnnotationCheckingTest.java @@ -18,6 +18,7 @@ package org.apache.servicecomb.saga.omega.transaction.spring; import static com.seanyinx.github.unit.scaffolding.AssertUtils.expectFailing; +import static org.hamcrest.CoreMatchers.endsWith; import static org.hamcrest.CoreMatchers.startsWith; import static org.hamcrest.core.Is.is; import static org.junit.Assert.assertThat; @@ -42,6 +43,19 @@ public class CompensableAnnotationCheckingTest { } @Test + public void blowsUpWhenCompensateRetriesIsBelowNegativeOne() throws Exception { + try { + try (ConfigurableApplicationContext ignored = new SpringApplicationBuilder(TransactionTestMain.class) + .profiles("annotation-retries-checking") + .run()) { + expectFailing(BeanCreationException.class); + } + } catch (BeanCreationException e) { + assertThat(e.getCause().getMessage(), endsWith("the retries should not below -1.")); + } + } + + @Test public void blowsUpWhenAnnotationOnWrongType() throws Exception { try { try (ConfigurableApplicationContext ignored = new SpringApplicationBuilder(TransactionTestMain.class) diff --git a/omega/omega-spring-tx/src/main/java/org/apache/servicecomb/saga/omega/transaction/spring/CompensableMethodCheckingCallback.java b/omega/omega-spring-tx/src/test/java/org/apache/servicecomb/saga/omega/transaction/spring/MisconfiguredRetriesService.java similarity index 60% copy from omega/omega-spring-tx/src/main/java/org/apache/servicecomb/saga/omega/transaction/spring/CompensableMethodCheckingCallback.java copy to omega/omega-spring-tx/src/test/java/org/apache/servicecomb/saga/omega/transaction/spring/MisconfiguredRetriesService.java index e3f4907..e68c99c 100644 --- a/omega/omega-spring-tx/src/main/java/org/apache/servicecomb/saga/omega/transaction/spring/CompensableMethodCheckingCallback.java +++ b/omega/omega-spring-tx/src/test/java/org/apache/servicecomb/saga/omega/transaction/spring/MisconfiguredRetriesService.java @@ -17,22 +17,15 @@ package org.apache.servicecomb.saga.omega.transaction.spring; -import java.lang.reflect.Method; -import org.apache.servicecomb.saga.omega.context.CallbackContext; import org.apache.servicecomb.saga.omega.transaction.annotations.Compensable; +import org.springframework.context.annotation.Profile; +import org.springframework.stereotype.Component; -class CompensableMethodCheckingCallback extends MethodCheckingCallback { +@Profile("annotation-retries-checking") +@Component +class MisconfiguredRetriesService { - public CompensableMethodCheckingCallback(Object bean, CallbackContext callbackContext) { - super(bean, callbackContext, CallbackType.Compensation); - } - - @Override - public void doWith(Method method) throws IllegalArgumentException { - if (!method.isAnnotationPresent(Compensable.class)) { - return; - } - String compensationMethod = method.getAnnotation(Compensable.class).compensationMethod(); - loadMethodContext(method, compensationMethod); + @Compensable(retries = -2) + void doSomething() { } } diff --git a/omega/omega-transaction/src/main/java/org/apache/servicecomb/saga/omega/transaction/annotations/Compensable.java b/omega/omega-transaction/src/main/java/org/apache/servicecomb/saga/omega/transaction/annotations/Compensable.java index c600fd1..9475374 100644 --- a/omega/omega-transaction/src/main/java/org/apache/servicecomb/saga/omega/transaction/annotations/Compensable.java +++ b/omega/omega-transaction/src/main/java/org/apache/servicecomb/saga/omega/transaction/annotations/Compensable.java @@ -24,6 +24,7 @@ import java.lang.annotation.Target; /** * Indicates the annotated method will start a sub-transaction. <br> + * It is suggested to use the Spring Transactional annotation to wrap the sub-transaction method. * A <code>@Compensable</code> method should satisfy below requirements: * <ol> * <li>all parameters are serialized</li> @@ -37,6 +38,15 @@ import java.lang.annotation.Target; @Retention(RetentionPolicy.RUNTIME) public @interface Compensable { + /** + * The retires number of the compensable method. + * Default value is 0, which means never retry it + * value is -1, which means retry it until succeed + * value > 0, which means the retry number + * value < -1, an IllegalArgumentException will be thrown + * + * @return + */ int retries() default 0; /**