From b2218d228f8c13749bf93cf32c330487c1b8aefb Mon Sep 17 00:00:00 2001 From: Janne Valkealahti Date: Wed, 21 Mar 2018 15:46:39 +0000 Subject: [PATCH] Executor may build up triggers with timers - Change executor behaviour so that it consumes all queued triggers which should help for cases where timers queue triggers where processing is waiting transition to happen. - Fixes #538 --- .../support/DefaultStateMachineExecutor.java | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/spring-statemachine-core/src/main/java/org/springframework/statemachine/support/DefaultStateMachineExecutor.java b/spring-statemachine-core/src/main/java/org/springframework/statemachine/support/DefaultStateMachineExecutor.java index 5a6616d1..3ad5673f 100644 --- a/spring-statemachine-core/src/main/java/org/springframework/statemachine/support/DefaultStateMachineExecutor.java +++ b/spring-statemachine-core/src/main/java/org/springframework/statemachine/support/DefaultStateMachineExecutor.java @@ -384,8 +384,16 @@ public class DefaultStateMachineExecutor extends LifecycleObjectSupport im } private void processTriggerQueue() { + while(processTriggerQueueUntilConsumed()) { + if (log.isTraceEnabled()) { + log.trace("calling next processTriggerQueueUntilConsumed"); + } + } + } + + private boolean processTriggerQueueUntilConsumed() { if (!isRunning()) { - return; + return false; } if (!initialHandled.getAndSet(true)) { ArrayList> trans = new ArrayList>(); @@ -396,7 +404,7 @@ public class DefaultStateMachineExecutor extends LifecycleObjectSupport im } else { handleInitialTrans(initialTransition, forwardedInitialEvent); } - return; + return false; } if (log.isDebugEnabled()) { log.debug("Process trigger queue, size=" + triggerQueue.size() + " " + this); @@ -464,7 +472,7 @@ public class DefaultStateMachineExecutor extends LifecycleObjectSupport im transit = handleTriggerTrans(transWithGuards, queuedMessage); } while (transit); } - + return !triggerQueue.isEmpty(); } @Override