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;
 
   /**

Reply via email to