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 <zhang...@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);