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 2018/08/10 03:43:12 UTC

[incubator-servicecomb-saga] 01/02: SCB-785 Support to get the globalTxId and localTxId when the componsation method is called.

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/incubator-servicecomb-saga.git

commit 279fd30f9027f52814780e946d99ed031103ace7
Author: jeremy-xu <je...@gmail.com>
AuthorDate: Sun Jul 29 23:03:51 2018 +0800

    SCB-785 Support to get the globalTxId and localTxId when the
    componsation method is called.
    
    1. 补偿方法里通过omegaContext.globalTxId()和omegaContext.localTxId()可得到当前分布式事务的全局事务ID及本地事务ID
---
 omega/omega-connector/omega-connector-grpc/pom.xml           |  5 +++++
 .../servicecomb/saga/omega/context/CompensationContext.java  | 12 ++++++++++++
 .../servicecomb/saga/omega/spring/OmegaSpringConfig.java     |  4 ++--
 .../transaction/spring/TransactionInterceptionTest.java      |  4 ++--
 4 files changed, 21 insertions(+), 4 deletions(-)

diff --git a/omega/omega-connector/omega-connector-grpc/pom.xml b/omega/omega-connector/omega-connector-grpc/pom.xml
index 7a14097..9569514 100644
--- a/omega/omega-connector/omega-connector-grpc/pom.xml
+++ b/omega/omega-connector/omega-connector-grpc/pom.xml
@@ -39,6 +39,11 @@
     </dependency>
     <dependency>
       <groupId>io.grpc</groupId>
+      <artifactId>grpc-stub</artifactId>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>io.grpc</groupId>
       <artifactId>grpc-netty</artifactId>
     </dependency>
     <dependency>
diff --git a/omega/omega-context/src/main/java/org/apache/servicecomb/saga/omega/context/CompensationContext.java b/omega/omega-context/src/main/java/org/apache/servicecomb/saga/omega/context/CompensationContext.java
index cf16888..0823240 100644
--- a/omega/omega-context/src/main/java/org/apache/servicecomb/saga/omega/context/CompensationContext.java
+++ b/omega/omega-context/src/main/java/org/apache/servicecomb/saga/omega/context/CompensationContext.java
@@ -30,6 +30,11 @@ public class CompensationContext {
   private static final Logger LOG = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
 
   private final Map<String, CompensationContextInternal> contexts = new ConcurrentHashMap<>();
+  private final OmegaContext omegaContext;
+
+  public CompensationContext(OmegaContext omegaContext) {
+    this.omegaContext = omegaContext;
+  }
 
   public void addCompensationContext(Method compensationMethod, Object target) {
     compensationMethod.setAccessible(true);
@@ -39,7 +44,11 @@ public class CompensationContext {
   public void apply(String globalTxId, String localTxId, String compensationMethod, Object... payloads) {
     CompensationContextInternal contextInternal = contexts.get(compensationMethod);
 
+    String oldGlobalTxId = omegaContext.globalTxId();
+    String oldLocalTxId= omegaContext.localTxId();
     try {
+      omegaContext.setGlobalTxId(globalTxId);
+      omegaContext.setLocalTxId(localTxId);
       contextInternal.compensationMethod.invoke(contextInternal.target, payloads);
       LOG.info("Compensated transaction with global tx id [{}], local tx id [{}]", globalTxId, localTxId);
     } catch (IllegalAccessException | InvocationTargetException e) {
@@ -47,6 +56,9 @@ public class CompensationContext {
           "Pre-checking for compensation method " + contextInternal.compensationMethod.toString()
               + " was somehow skipped, did you forget to configure compensable method checking on service startup?",
           e);
+    } finally {
+      omegaContext.setGlobalTxId(oldGlobalTxId);
+      omegaContext.setLocalTxId(oldLocalTxId);
     }
   }
 
diff --git a/omega/omega-spring-starter/src/main/java/org/apache/servicecomb/saga/omega/spring/OmegaSpringConfig.java b/omega/omega-spring-starter/src/main/java/org/apache/servicecomb/saga/omega/spring/OmegaSpringConfig.java
index afa6443..51324e7 100644
--- a/omega/omega-spring-starter/src/main/java/org/apache/servicecomb/saga/omega/spring/OmegaSpringConfig.java
+++ b/omega/omega-spring-starter/src/main/java/org/apache/servicecomb/saga/omega/spring/OmegaSpringConfig.java
@@ -52,8 +52,8 @@ class OmegaSpringConfig {
   }
 
   @Bean
-  CompensationContext compensationContext() {
-    return new CompensationContext();
+  CompensationContext compensationContext(OmegaContext omegaContext) {
+    return new CompensationContext(omegaContext);
   }
 
   @Bean
diff --git a/omega/omega-spring-tx/src/test/java/org/apache/servicecomb/saga/omega/transaction/spring/TransactionInterceptionTest.java b/omega/omega-spring-tx/src/test/java/org/apache/servicecomb/saga/omega/transaction/spring/TransactionInterceptionTest.java
index 75d5864..5f3f708 100644
--- a/omega/omega-spring-tx/src/test/java/org/apache/servicecomb/saga/omega/transaction/spring/TransactionInterceptionTest.java
+++ b/omega/omega-spring-tx/src/test/java/org/apache/servicecomb/saga/omega/transaction/spring/TransactionInterceptionTest.java
@@ -408,8 +408,8 @@ public class TransactionInterceptionTest {
     private final List<String> messages = new ArrayList<>();
 
     @Bean
-    CompensationContext recoveryContext() {
-      return new CompensationContext();
+    CompensationContext recoveryContext(OmegaContext omegaContext) {
+      return new CompensationContext(omegaContext);
     }
 
     @Bean