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 2358e3a5..7b6f12bd 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 @@ -234,7 +234,6 @@ public class DefaultStateMachineExecutor extends LifecycleObjectSupport im continue; } else if (!StateMachineUtils.isSubstate(source, completion)) { - log.info("TTTTTT6 " + source.getId() + " " + completion.getId()); continue; } @@ -449,10 +448,10 @@ public class DefaultStateMachineExecutor extends LifecycleObjectSupport im handleTriggerTrans(trans, queuedMessage); } - List> ttt = new ArrayList<>(); - for (Transition tt : triggerlessTransitions) { - if (((AbstractTransition)tt).getGuard() != null) { - ttt.add(tt); + List> transWithGuards = new ArrayList<>(); + for (Transition t : triggerlessTransitions) { + if (((AbstractTransition)t).getGuard() != null) { + transWithGuards.add(t); } } @@ -461,7 +460,7 @@ public class DefaultStateMachineExecutor extends LifecycleObjectSupport im // all "chained" transitions will get queue message boolean transit = false; do { - transit = handleTriggerTrans(ttt, queuedMessage); + transit = handleTriggerTrans(transWithGuards, queuedMessage); } while (transit); } diff --git a/spring-statemachine-core/src/test/java/org/springframework/statemachine/AbstractStateMachineTests.java b/spring-statemachine-core/src/test/java/org/springframework/statemachine/AbstractStateMachineTests.java index 41ef9cd4..57895c21 100644 --- a/spring-statemachine-core/src/test/java/org/springframework/statemachine/AbstractStateMachineTests.java +++ b/spring-statemachine-core/src/test/java/org/springframework/statemachine/AbstractStateMachineTests.java @@ -278,4 +278,25 @@ public abstract class AbstractStateMachineTests { } + public static class TestStateMachineListener4 extends StateMachineListenerAdapter { + + public volatile CountDownLatch stateChangedLatch = new CountDownLatch(6); + public volatile CountDownLatch stateMachineStartedLatch = new CountDownLatch(1); + + @Override + public void stateChanged(State from, State to) { + stateChangedLatch.countDown(); + } + + @Override + public void stateMachineStarted(StateMachine stateMachine) { + stateMachineStartedLatch.countDown(); + } + + public void reset(int c1, int c2) { + stateChangedLatch = new CountDownLatch(c1); + stateMachineStartedLatch = new CountDownLatch(c2); + } + + } } diff --git a/spring-statemachine-core/src/test/java/org/springframework/statemachine/state/EndStateTests.java b/spring-statemachine-core/src/test/java/org/springframework/statemachine/state/EndStateTests.java index 72918906..f0c2d105 100644 --- a/spring-statemachine-core/src/test/java/org/springframework/statemachine/state/EndStateTests.java +++ b/spring-statemachine-core/src/test/java/org/springframework/statemachine/state/EndStateTests.java @@ -23,6 +23,7 @@ import static org.junit.Assert.assertThat; import static org.junit.Assert.assertTrue; import java.util.EnumSet; +import java.util.concurrent.TimeUnit; import org.junit.Test; import org.springframework.context.annotation.AnnotationConfigApplicationContext; @@ -174,10 +175,12 @@ public class EndStateTests extends AbstractStateMachineTests { @SuppressWarnings("unchecked") ObjectStateMachine machine = context.getBean(StateMachineSystemConstants.DEFAULT_ID_STATEMACHINE, ObjectStateMachine.class); + TestStateMachineListener4 listener = new TestStateMachineListener4(); + machine.addStateListener(listener); machine.start(); - Thread.sleep(1000); + assertThat(listener.stateMachineStartedLatch.await(2, TimeUnit.SECONDS), is(true)); machine.sendEvent(TestEvents.E1); - Thread.sleep(1000); + assertThat(listener.stateChangedLatch.await(2, TimeUnit.SECONDS), is(true)); assertThat(machine.getState().getIds(), contains(TestStates4.DONE)); } @@ -189,10 +192,12 @@ public class EndStateTests extends AbstractStateMachineTests { @SuppressWarnings("unchecked") ObjectStateMachine machine = context.getBean(StateMachineSystemConstants.DEFAULT_ID_STATEMACHINE, ObjectStateMachine.class); + TestStateMachineListener4 listener = new TestStateMachineListener4(); + machine.addStateListener(listener); machine.start(); - Thread.sleep(1000); + assertThat(listener.stateMachineStartedLatch.await(2, TimeUnit.SECONDS), is(true)); machine.sendEvent(TestEvents.E1); - Thread.sleep(1000); + assertThat(listener.stateChangedLatch.await(2, TimeUnit.SECONDS), is(true)); assertThat(machine.getState().getIds(), contains(TestStates4.DONE)); } @@ -204,17 +209,28 @@ public class EndStateTests extends AbstractStateMachineTests { @SuppressWarnings("unchecked") ObjectStateMachine machine = context.getBean(StateMachineSystemConstants.DEFAULT_ID_STATEMACHINE, ObjectStateMachine.class); + TestStateMachineListener4 listener = new TestStateMachineListener4(); + machine.addStateListener(listener); + listener.reset(1, 1); + machine.start(); - Thread.sleep(1000); + assertThat(listener.stateMachineStartedLatch.await(2, TimeUnit.SECONDS), is(true)); + assertThat(listener.stateChangedLatch.await(2, TimeUnit.SECONDS), is(true)); assertThat(machine.getState().getIds(), contains(TestStates4.READY)); + + listener.reset(3, 0); machine.sendEvent(TestEvents.E1); - Thread.sleep(1000); + assertThat(listener.stateChangedLatch.await(2, TimeUnit.SECONDS), is(true)); assertThat(machine.getState().getIds(), containsInAnyOrder(TestStates4.TASKS, TestStates4.T1, TestStates4.T2)); + + listener.reset(1, 0); machine.sendEvent(TestEvents.E2); - Thread.sleep(1000); + assertThat(listener.stateChangedLatch.await(2, TimeUnit.SECONDS), is(true)); assertThat(machine.getState().getIds(), containsInAnyOrder(TestStates4.TASKS, TestStates4.T1E, TestStates4.T2)); + + listener.reset(2, 0); machine.sendEvent(TestEvents.E3); - Thread.sleep(1000); + assertThat(listener.stateChangedLatch.await(2, TimeUnit.SECONDS), is(true)); assertThat(machine.getState().getIds(), contains(TestStates4.DONE)); }