You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@servicecomb.apache.org by ni...@apache.org on 2019/12/29 14:51:24 UTC

[servicecomb-pack] 02/02: SCB-1695 Add attribute mode to @Compensable annotation

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-pack.git

commit 898e1ee5a128590d6a3f082fa23f29407082c48f
Author: Lei Zhang <zh...@apache.org>
AuthorDate: Sun Dec 29 00:16:04 2019 +0800

    SCB-1695 Add attribute mode to @Compensable annotation
---
 docs/upgrade_guide/0.6.0-upgrade-guide.md                 |  5 +++++
 docs/upgrade_guide/0.6.0-upgrade-guide_zh.md              |  6 ++++++
 .../tests/explicitcontext/GreetingService.java            |  3 ++-
 .../integration/tests/resttemplate/GreetingService.java   |  3 ++-
 .../transaction/spring/MisconfiguredRetriesService.java   |  3 ++-
 .../transaction/spring/TransactionalUserService.java      |  3 ++-
 .../pack/omega/transaction/RecoveryPolicyFactory.java     | 12 +++++++-----
 .../pack/omega/transaction/TransactionAspect.java         |  5 ++---
 .../pack/omega/transaction/annotations/Compensable.java   |  9 +++++++++
 .../omega/transaction/annotations/CompensableMode.java}   | 15 +++------------
 .../pack/omega/transaction/ForwardRecoveryTest.java       |  3 +++
 .../pack/omega/transaction/TransactionAspectTest.java     |  3 +++
 12 files changed, 46 insertions(+), 24 deletions(-)

diff --git a/docs/upgrade_guide/0.6.0-upgrade-guide.md b/docs/upgrade_guide/0.6.0-upgrade-guide.md
index 0b1afd1..4ca1f99 100644
--- a/docs/upgrade_guide/0.6.0-upgrade-guide.md
+++ b/docs/upgrade_guide/0.6.0-upgrade-guide.md
@@ -8,3 +8,8 @@ Rename @Compensable annotation property `retries`  to `forwardRetries`
 
 Rename @Compensable annotation property `timeout`  to `forwardTimeout`
 
+Add attribute `mode` to @Compensable annotation, There are three options for attribute values
+
+- forward, it will use the forward recovery
+- reverse, it will use the reverse recovery (default)
+- combine, it will use the first forward then reverse
\ No newline at end of file
diff --git a/docs/upgrade_guide/0.6.0-upgrade-guide_zh.md b/docs/upgrade_guide/0.6.0-upgrade-guide_zh.md
index 4d0ad7d..d089c9e 100644
--- a/docs/upgrade_guide/0.6.0-upgrade-guide_zh.md
+++ b/docs/upgrade_guide/0.6.0-upgrade-guide_zh.md
@@ -8,3 +8,9 @@
 
 @Compensable 注解的 `timeout` 属性改名为 `forwardTimeout`
 
+@Compensable 增加 `mode` 属性 ,可选属性值为以下三种
+
+- forward 正向补偿
+- reverse 反向补偿(默认)
+- combine 组合补偿(先正向补偿,后反向补偿)
+
diff --git a/integration-tests/explicit-transaction-context-tests/src/test/java/org/apache/servicecomb/pack/integration/tests/explicitcontext/GreetingService.java b/integration-tests/explicit-transaction-context-tests/src/test/java/org/apache/servicecomb/pack/integration/tests/explicitcontext/GreetingService.java
index 782412f..7957f45 100644
--- a/integration-tests/explicit-transaction-context-tests/src/test/java/org/apache/servicecomb/pack/integration/tests/explicitcontext/GreetingService.java
+++ b/integration-tests/explicit-transaction-context-tests/src/test/java/org/apache/servicecomb/pack/integration/tests/explicitcontext/GreetingService.java
@@ -21,6 +21,7 @@ import java.util.Queue;
 
 import org.apache.servicecomb.pack.omega.context.TransactionContext;
 import org.apache.servicecomb.pack.omega.transaction.annotations.Compensable;
+import org.apache.servicecomb.pack.omega.transaction.annotations.CompensableMode;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
@@ -63,7 +64,7 @@ class GreetingService  {
     return appendMessage("My bad, please take the window instead, " + name);
   }
 
-  @Compensable(forwardRetries = MAX_COUNT, compensationMethod = "close")
+  @Compensable(mode = CompensableMode.forward, forwardRetries = MAX_COUNT, compensationMethod = "close")
   String open(String name, int retries, TransactionContext transactionContext) {
     if (failedCount < retries) {
       failedCount += 1;
diff --git a/integration-tests/pack-tests/src/test/java/org/apache/servicecomb/pack/integration/tests/resttemplate/GreetingService.java b/integration-tests/pack-tests/src/test/java/org/apache/servicecomb/pack/integration/tests/resttemplate/GreetingService.java
index e3758bb..f55677a 100644
--- a/integration-tests/pack-tests/src/test/java/org/apache/servicecomb/pack/integration/tests/resttemplate/GreetingService.java
+++ b/integration-tests/pack-tests/src/test/java/org/apache/servicecomb/pack/integration/tests/resttemplate/GreetingService.java
@@ -20,6 +20,7 @@ package org.apache.servicecomb.pack.integration.tests.resttemplate;
 import java.util.Queue;
 
 import org.apache.servicecomb.pack.omega.transaction.annotations.Compensable;
+import org.apache.servicecomb.pack.omega.transaction.annotations.CompensableMode;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
@@ -62,7 +63,7 @@ class GreetingService {
     return appendMessage("My bad, please take the window instead, " + name);
   }
 
-  @Compensable(forwardRetries = MAX_COUNT, compensationMethod = "close")
+  @Compensable(mode = CompensableMode.forward, forwardRetries = MAX_COUNT, compensationMethod = "close")
   String open(String name, int retries) {
     if (failedCount < retries) {
       failedCount += 1;
diff --git a/omega/omega-spring-tx/src/test/java/org/apache/servicecomb/pack/omega/transaction/spring/MisconfiguredRetriesService.java b/omega/omega-spring-tx/src/test/java/org/apache/servicecomb/pack/omega/transaction/spring/MisconfiguredRetriesService.java
index f95d99f..2504626 100644
--- a/omega/omega-spring-tx/src/test/java/org/apache/servicecomb/pack/omega/transaction/spring/MisconfiguredRetriesService.java
+++ b/omega/omega-spring-tx/src/test/java/org/apache/servicecomb/pack/omega/transaction/spring/MisconfiguredRetriesService.java
@@ -18,6 +18,7 @@
 package org.apache.servicecomb.pack.omega.transaction.spring;
 
 import org.apache.servicecomb.pack.omega.transaction.annotations.Compensable;
+import org.apache.servicecomb.pack.omega.transaction.annotations.CompensableMode;
 import org.springframework.context.annotation.Profile;
 import org.springframework.stereotype.Component;
 
@@ -25,7 +26,7 @@ import org.springframework.stereotype.Component;
 @Component
 class MisconfiguredRetriesService {
 
-  @Compensable(forwardRetries = -2)
+  @Compensable(mode = CompensableMode.forward, forwardRetries = -2)
   void doSomething() {
   }
 }
diff --git a/omega/omega-spring-tx/src/test/java/org/apache/servicecomb/pack/omega/transaction/spring/TransactionalUserService.java b/omega/omega-spring-tx/src/test/java/org/apache/servicecomb/pack/omega/transaction/spring/TransactionalUserService.java
index 08030a0..a7b647b 100644
--- a/omega/omega-spring-tx/src/test/java/org/apache/servicecomb/pack/omega/transaction/spring/TransactionalUserService.java
+++ b/omega/omega-spring-tx/src/test/java/org/apache/servicecomb/pack/omega/transaction/spring/TransactionalUserService.java
@@ -18,6 +18,7 @@
 package org.apache.servicecomb.pack.omega.transaction.spring;
 
 import org.apache.servicecomb.pack.omega.transaction.annotations.Compensable;
+import org.apache.servicecomb.pack.omega.transaction.annotations.CompensableMode;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 import org.springframework.transaction.annotation.Transactional;
@@ -51,7 +52,7 @@ public class TransactionalUserService {
     userRepository.delete(user);
   }
 
-  @Compensable(forwardRetries = 2, compensationMethod = "delete")
+  @Compensable(mode = CompensableMode.forward, forwardRetries = 2, compensationMethod = "delete")
   public User add(User user, int count) {
     if (this.count < count) {
       this.count += 1;
diff --git a/omega/omega-transaction/src/main/java/org/apache/servicecomb/pack/omega/transaction/RecoveryPolicyFactory.java b/omega/omega-transaction/src/main/java/org/apache/servicecomb/pack/omega/transaction/RecoveryPolicyFactory.java
index 33098d9..e84b5d3 100644
--- a/omega/omega-transaction/src/main/java/org/apache/servicecomb/pack/omega/transaction/RecoveryPolicyFactory.java
+++ b/omega/omega-transaction/src/main/java/org/apache/servicecomb/pack/omega/transaction/RecoveryPolicyFactory.java
@@ -17,17 +17,19 @@
 
 package org.apache.servicecomb.pack.omega.transaction;
 
+import org.apache.servicecomb.pack.omega.transaction.annotations.CompensableMode;
+
 public class RecoveryPolicyFactory {
   private static final RecoveryPolicy DEFAULT_RECOVERY = new DefaultRecovery();
 
   private static final RecoveryPolicy FORWARD_RECOVERY = new ForwardRecovery();
 
   /**
-   * If retries == 0, use the default recovery to execute only once.
-   * If retries > 0, it will use the forward recovery and retry the given times at most.
-   * If retries == -1, it will use the forward recovery and retry forever until interrupted.
+   * If mode is reverse, it will use the reverse recovery
+   * If mode is forward, it will use the forward recovery
+   * If mode is combine, it will use the first forward then reverse
    */
-  static RecoveryPolicy getRecoveryPolicy(int retries) {
-    return retries != 0 ? FORWARD_RECOVERY : DEFAULT_RECOVERY;
+  static RecoveryPolicy getRecoveryPolicy(CompensableMode mode) {
+    return mode == CompensableMode.forward ? FORWARD_RECOVERY : DEFAULT_RECOVERY;
   }
 }
diff --git a/omega/omega-transaction/src/main/java/org/apache/servicecomb/pack/omega/transaction/TransactionAspect.java b/omega/omega-transaction/src/main/java/org/apache/servicecomb/pack/omega/transaction/TransactionAspect.java
index 826480d..e280b1c 100644
--- a/omega/omega-transaction/src/main/java/org/apache/servicecomb/pack/omega/transaction/TransactionAspect.java
+++ b/omega/omega-transaction/src/main/java/org/apache/servicecomb/pack/omega/transaction/TransactionAspect.java
@@ -63,10 +63,9 @@ public class TransactionAspect extends TransactionContextHelper {
     context.newLocalTxId();
     LOG.debug("Updated context {} for compensable method {} ", context, method.toString());
 
-    int retries = compensable.forwardRetries();
-    RecoveryPolicy recoveryPolicy = RecoveryPolicyFactory.getRecoveryPolicy(retries);
+    RecoveryPolicy recoveryPolicy = RecoveryPolicyFactory.getRecoveryPolicy(compensable.mode());
     try {
-      return recoveryPolicy.apply(joinPoint, compensable, interceptor, context, localTxId, retries);
+      return recoveryPolicy.apply(joinPoint, compensable, interceptor, context, localTxId, compensable.forwardRetries());
     } finally {
       context.setLocalTxId(localTxId);
       LOG.debug("Restored context back to {}", context);
diff --git a/omega/omega-transaction/src/main/java/org/apache/servicecomb/pack/omega/transaction/annotations/Compensable.java b/omega/omega-transaction/src/main/java/org/apache/servicecomb/pack/omega/transaction/annotations/Compensable.java
index 8ed5081..7bc7f13 100644
--- a/omega/omega-transaction/src/main/java/org/apache/servicecomb/pack/omega/transaction/annotations/Compensable.java
+++ b/omega/omega-transaction/src/main/java/org/apache/servicecomb/pack/omega/transaction/annotations/Compensable.java
@@ -73,4 +73,13 @@ public @interface Compensable {
    */
   int forwardTimeout() default 0;
 
+  /**
+   * Compensation mode. <br>
+   * Default value is reverse
+   * value is forward, it will use the forward recovery
+   * value is reverse, it will use the reverse recovery
+   * value is combine, first forward then reverse
+   * @return compensable mode enum value
+   */
+  CompensableMode mode() default CompensableMode.reverse;
 }
diff --git a/omega/omega-spring-tx/src/test/java/org/apache/servicecomb/pack/omega/transaction/spring/MisconfiguredRetriesService.java b/omega/omega-transaction/src/main/java/org/apache/servicecomb/pack/omega/transaction/annotations/CompensableMode.java
similarity index 67%
copy from omega/omega-spring-tx/src/test/java/org/apache/servicecomb/pack/omega/transaction/spring/MisconfiguredRetriesService.java
copy to omega/omega-transaction/src/main/java/org/apache/servicecomb/pack/omega/transaction/annotations/CompensableMode.java
index f95d99f..9ec563a 100644
--- a/omega/omega-spring-tx/src/test/java/org/apache/servicecomb/pack/omega/transaction/spring/MisconfiguredRetriesService.java
+++ b/omega/omega-transaction/src/main/java/org/apache/servicecomb/pack/omega/transaction/annotations/CompensableMode.java
@@ -15,17 +15,8 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.pack.omega.transaction.spring;
+package org.apache.servicecomb.pack.omega.transaction.annotations;
 
-import org.apache.servicecomb.pack.omega.transaction.annotations.Compensable;
-import org.springframework.context.annotation.Profile;
-import org.springframework.stereotype.Component;
-
-@Profile("annotation-retries-checking")
-@Component
-class MisconfiguredRetriesService {
-
-  @Compensable(forwardRetries = -2)
-  void doSomething() {
-  }
+public enum CompensableMode {
+  forward, reverse, combine
 }
diff --git a/omega/omega-transaction/src/test/java/org/apache/servicecomb/pack/omega/transaction/ForwardRecoveryTest.java b/omega/omega-transaction/src/test/java/org/apache/servicecomb/pack/omega/transaction/ForwardRecoveryTest.java
index 1d16c93..753780e 100644
--- a/omega/omega-transaction/src/test/java/org/apache/servicecomb/pack/omega/transaction/ForwardRecoveryTest.java
+++ b/omega/omega-transaction/src/test/java/org/apache/servicecomb/pack/omega/transaction/ForwardRecoveryTest.java
@@ -40,6 +40,7 @@ import org.apache.servicecomb.pack.contract.grpc.ServerMeta;
 import org.apache.servicecomb.pack.omega.context.IdGenerator;
 import org.apache.servicecomb.pack.omega.context.OmegaContext;
 import org.apache.servicecomb.pack.omega.transaction.annotations.Compensable;
+import org.apache.servicecomb.pack.omega.transaction.annotations.CompensableMode;
 import org.aspectj.lang.ProceedingJoinPoint;
 import org.aspectj.lang.reflect.MethodSignature;
 import org.junit.Before;
@@ -144,6 +145,7 @@ public class ForwardRecoveryTest {
   @Test
   public void throwExceptionWhenRetryReachesMaximum() throws Throwable {
     when(compensable.forwardRetries()).thenReturn(2);
+    when(compensable.mode()).thenReturn(CompensableMode.forward);
     when(joinPoint.proceed()).thenThrow(oops);
 
     try {
@@ -166,6 +168,7 @@ public class ForwardRecoveryTest {
   public void keepRetryingTillInterrupted() throws Throwable {
     when(compensable.forwardRetries()).thenReturn(-1);
     when(compensable.retryDelayInMilliseconds()).thenReturn(1000);
+    when(compensable.mode()).thenReturn(CompensableMode.forward);
     when(joinPoint.proceed()).thenThrow(oops);
 
     Thread thread = new Thread(new Runnable() {
diff --git a/omega/omega-transaction/src/test/java/org/apache/servicecomb/pack/omega/transaction/TransactionAspectTest.java b/omega/omega-transaction/src/test/java/org/apache/servicecomb/pack/omega/transaction/TransactionAspectTest.java
index 39a32c4..4eb45e4 100644
--- a/omega/omega-transaction/src/test/java/org/apache/servicecomb/pack/omega/transaction/TransactionAspectTest.java
+++ b/omega/omega-transaction/src/test/java/org/apache/servicecomb/pack/omega/transaction/TransactionAspectTest.java
@@ -42,6 +42,7 @@ import org.apache.servicecomb.pack.omega.context.IdGenerator;
 import org.apache.servicecomb.pack.omega.context.OmegaContext;
 import org.apache.servicecomb.pack.omega.context.TransactionContextProperties;
 import org.apache.servicecomb.pack.omega.transaction.annotations.Compensable;
+import org.apache.servicecomb.pack.omega.transaction.annotations.CompensableMode;
 import org.aspectj.lang.ProceedingJoinPoint;
 import org.aspectj.lang.reflect.MethodSignature;
 import org.junit.Before;
@@ -310,6 +311,7 @@ public class TransactionAspectTest {
     RuntimeException oops = new RuntimeException("oops");
     when(joinPoint.proceed()).thenThrow(oops);
     when(compensable.forwardRetries()).thenReturn(3);
+    when(compensable.mode()).thenReturn(CompensableMode.forward);
 
     try {
       aspect.advise(joinPoint, compensable);
@@ -354,6 +356,7 @@ public class TransactionAspectTest {
     RuntimeException oops = new RuntimeException("oops");
     when(joinPoint.proceed()).thenThrow(oops).thenThrow(oops).thenReturn(null);
     when(compensable.forwardRetries()).thenReturn(-1);
+    when(compensable.mode()).thenReturn(CompensableMode.forward);
 
     aspect.advise(joinPoint, compensable);