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 655b6dd497fd8e71b4a8b790a733c25435d8ca7f
Author: Lei Zhang <zhang...@apache.org>
AuthorDate: Sat Mar 21 22:08:19 2020 +0800

    SCB-1735 Modify compensate method support asynchronous timeout
---
 .../fsm/spring/integration/akka/SpringAkkaExtension.java | 16 +++++++++++++++-
 1 file changed, 15 insertions(+), 1 deletion(-)

diff --git 
a/alpha/alpha-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/spring/integration/akka/SpringAkkaExtension.java
 
b/alpha/alpha-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/spring/integration/akka/SpringAkkaExtension.java
index 6346d80..6892a20 100644
--- 
a/alpha/alpha-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/spring/integration/akka/SpringAkkaExtension.java
+++ 
b/alpha/alpha-fsm/src/main/java/org/apache/servicecomb/pack/alpha/fsm/spring/integration/akka/SpringAkkaExtension.java
@@ -23,6 +23,10 @@ import akka.actor.AbstractExtensionId;
 import akka.actor.ExtendedActorSystem;
 import akka.actor.Extension;
 import java.lang.invoke.MethodHandles;
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.TimeoutException;
 import org.apache.servicecomb.pack.alpha.core.OmegaCallback;
 import org.apache.servicecomb.pack.alpha.core.TxEvent;
 import org.apache.servicecomb.pack.alpha.fsm.model.TxEntity;
@@ -47,7 +51,17 @@ public class SpringAkkaExtension extends 
AbstractExtensionId<SpringExt> {
     private volatile ApplicationContext applicationContext;
     private OmegaCallback omegaCallback;
 
-    public void compensate(TxEntity txEntity) {
+    public void compensate(TxEntity txEntity)
+        throws InterruptedException, ExecutionException, TimeoutException {
+      if (txEntity.getReverseTimeout() > 0) {
+        CompletableFuture.runAsync(() -> doCompensate(txEntity))
+            .get(txEntity.getReverseTimeout(), TimeUnit.SECONDS);
+      } else {
+        doCompensate(txEntity);
+      }
+    }
+
+    private void doCompensate(TxEntity txEntity) {
       if (applicationContext != null) {
         if (applicationContext.containsBean(omegaCallbackBeanName)) {
           omegaCallback = applicationContext.getBean(omegaCallbackBeanName, 
OmegaCallback.class);

Reply via email to