SCB-1735 Modify compensate method support asynchronous timeout
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.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 @@
     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);