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);