[
https://issues.apache.org/jira/browse/SCB-785?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16575782#comment-16575782
]
ASF GitHub Bot commented on SCB-785:
------------------------------------
WillemJiang closed pull request #237: [SCB-785] 支持在补偿方法里得到当前分布式事务的全局事务ID及本地事务ID
URL: https://github.com/apache/incubator-servicecomb-saga/pull/237
This is a PR merged from a forked repository.
As GitHub hides the original diff on merge, it is displayed below for
the sake of provenance:
As this is a foreign pull request (from a fork), the diff is supplied
below (as it won't show otherwise due to GitHub magic):
diff --git a/omega/omega-connector/omega-connector-grpc/pom.xml
b/omega/omega-connector/omega-connector-grpc/pom.xml
index 7a140975..9569514f 100644
--- a/omega/omega-connector/omega-connector-grpc/pom.xml
+++ b/omega/omega-connector/omega-connector-grpc/pom.xml
@@ -37,6 +37,11 @@
<groupId>io.grpc</groupId>
<artifactId>grpc-protobuf</artifactId>
</dependency>
+ <dependency>
+ <groupId>io.grpc</groupId>
+ <artifactId>grpc-stub</artifactId>
+ <scope>test</scope>
+ </dependency>
<dependency>
<groupId>io.grpc</groupId>
<artifactId>grpc-netty</artifactId>
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 cf16888a..0823240a 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 @@
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 void addCompensationContext(Method
compensationMethod, Object target) {
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 void apply(String globalTxId, String localTxId, String
compensationMethod
"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 aaf67f64..ec4ced35 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 @@ OmegaContext
omegaContext(@Qualifier("omegaUniqueIdGenerator") IdGenerator<Strin
}
@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 6505bfcb..64ebc352 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
@@ -361,8 +361,8 @@ public Receive createReceive() {
private final List<String> messages = new ArrayList<>();
@Bean
- CompensationContext recoveryContext() {
- return new CompensationContext();
+ CompensationContext recoveryContext(OmegaContext omegaContext) {
+ return new CompensationContext(omegaContext);
}
@Bean
diff --git a/pom.xml b/pom.xml
index e99b71eb..d21734b5 100644
--- a/pom.xml
+++ b/pom.xml
@@ -61,7 +61,7 @@
<akka.version>2.5.6</akka.version>
<rat.version>0.12</rat.version>
<maven.failsafe.version>2.19.1</maven.failsafe.version>
- <grpc.version>1.11.0</grpc.version>
+ <grpc.version>1.14.0</grpc.version>
<kryo.version>4.0.1</kryo.version>
<javax.transaction.version>1.2</javax.transaction.version>
<eclipse.link.version>2.7.1</eclipse.link.version>
----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on GitHub and use the
URL above to go to the specific comment.
For queries about this service, please contact Infrastructure at:
[email protected]
> Cannot get the GlobalTxId and LocalTxId in the compensation method
> ------------------------------------------------------------------
>
> Key: SCB-785
> URL: https://issues.apache.org/jira/browse/SCB-785
> Project: Apache ServiceComb
> Issue Type: Improvement
> Components: Saga
> Affects Versions: saga-0.2.0
> Reporter: Jeremy Xu
> Priority: Minor
> Fix For: saga-0.3.0
>
>
> 补偿方法里无法获取分布式事务的全局事务ID及本地事务ID
> 因为在子事务业务处理方法中会将一部分中间数据存入外部缓存中,对应的补偿方法将可以通过这些中间数据进行合理的补偿操作,当时存入中间数据时会附带上globalTxId,
> localTxId,后面将根据这个查找到之前存入的中间数据。但发现在业务方法中可以获取分布式事务的全局事务ID及本地事务ID,但对应的补偿方法里却不行。
> Customer may want to access the globalTxId and LocalTxId in application to
> store these information into DB for the recovery.
> 示例代码如下:
>
> {code:java}
> @Autowired
> OmegaContext omegaContext;
> @Compensable(timeout=5, compensationMethod="cancel")
> public boolean transferOut(String from, int amount) {
> // 这里可以获得
> System.out.println(omegaContext.globalTxId());
> System.out.println(omegaContext.localTxId());
> repo.reduceBalanceByUsername(from, amount);
> }
> public boolean cancel(String from, int amount) {
> // 这里不可以获得
> System.out.println(omegaContext.globalTxId());
> System.out.println(omegaContext.localTxId());
> repo.addBalanceByUsername(from, amount);
> }
> {code}
>
--
This message was sent by Atlassian JIRA
(v7.6.3#76005)