List of usage examples for org.springframework.statemachine.state State shouldDefer
boolean shouldDefer(Message<E> event);
From source file:org.springframework.statemachine.support.DefaultStateMachineExecutor.java
private boolean processEventQueue() { if (log.isDebugEnabled()) { log.debug("Process event queue, size=" + eventQueue.size()); }/* ww w. j a v a 2 s.c o m*/ Message<E> queuedEvent = eventQueue.poll(); State<S, E> currentState = stateMachine.getState(); if (queuedEvent != null) { if ((currentState != null && currentState.shouldDefer(queuedEvent))) { log.info("Current state " + currentState + " deferred event " + queuedEvent); queueDeferredEvent(queuedEvent); return true; } for (Transition<S, E> transition : transitions) { State<S, E> source = transition.getSource(); Trigger<S, E> trigger = transition.getTrigger(); if (StateMachineUtils.containsAtleastOne(source.getIds(), currentState.getIds())) { if (trigger != null && trigger.evaluate(new DefaultTriggerContext<S, E>(queuedEvent.getPayload()))) { queueTrigger(trigger, queuedEvent); return true; } } } } return false; }
From source file:org.springframework.statemachine.support.DefaultStateMachineExecutor.java
private synchronized boolean processDeferList() { if (log.isDebugEnabled()) { log.debug("Process defer list, size=" + deferList.size()); }//from ww w. j ava 2 s.c om ListIterator<Message<E>> iterator = deferList.listIterator(); State<S, E> currentState = stateMachine.getState(); while (iterator.hasNext()) { Message<E> event = iterator.next(); if (currentState.shouldDefer(event)) { // if current state still defers, just continue with others continue; } for (Transition<S, E> transition : transitions) { State<S, E> source = transition.getSource(); Trigger<S, E> trigger = transition.getTrigger(); if (source.equals(currentState)) { if (trigger != null && trigger.evaluate(new DefaultTriggerContext<S, E>(event.getPayload()))) { triggerQueue.add(new TriggerQueueItem(trigger, event)); iterator.remove(); // bail out when first deferred message is causing a trigger to fire return true; } } } } return false; }