Comments (5)
The listeners I've added are the following:
public void attachListenersToFSM () {
fsm.addStartListener(startListener);
fsm.addStateMachineExceptionListener(stateMachineExceptionListener);
fsm.addStateMachineListener(stateMachineListener);
fsm.addTransitionBeginListener(transitionBeginListener);
fsm.addTransitionCompleteListener(transitionCompleteListener);
fsm.addTransitionDeclinedListener(transitionDeclinedListener);
fsm.addTransitionEndListener(transitionEndListener);
fsm.addTransitionExceptionListener(transitionExceptionListener);
}
removed in the following order:
public void detachListenersToFSM () {
fsm.removeTransitionExceptionListener(transitionExceptionListener);
fsm.removeTransitionEndListener(transitionEndListener); // <== Exception thrown
fsm.removeTransitionDecleindListener(transitionDeclinedListener);
fsm.removeTransitionCompleteListener(transitionCompleteListener);
fsm.removeTransitionBeginListener(transitionBeginListener);
fsm.removeStateMachineListener(stateMachineListener);
fsm.removeStateMachineExceptionListener(stateMachineExceptionListener);
fsm.removeStartListener(startListener);
}
from squirrel.
It would be helpful if you can provide a runnable test case to reproduce the issue.
from squirrel.
Here a test case: it's a mixture of my code and your example... but it works throwing the exception.
Java 8 is required for the lambda expressions.
import org.squirrelframework.foundation.fsm.StateMachine;
import org.squirrelframework.foundation.fsm.StateMachineBuilderFactory;
import org.squirrelframework.foundation.fsm.UntypedStateMachine;
import org.squirrelframework.foundation.fsm.UntypedStateMachineBuilder;
import org.squirrelframework.foundation.fsm.annotation.StateMachineParameters;
import org.squirrelframework.foundation.fsm.impl.AbstractUntypedStateMachine;
public class QuickStartSample {
private static final StateMachine.StartListener startListener = e -> started(e);
private static final StateMachine.StateMachineExceptionListener stateMachineExceptionListener = e -> stateMachineException(e);
private static final StateMachine.StateMachineListener stateMachineListener = e -> stateMachineEvent(e);
private static final StateMachine.TransitionBeginListener transitionBeginListener = e -> transitionBegin(e);
private static final StateMachine.TransitionCompleteListener transitionCompleteListener = e -> transitionComplete(e);
private static final StateMachine.TransitionDeclinedListener transitionDeclinedListener = e -> transitionDeclined(e);
private static final StateMachine.TransitionEndListener transitionEndListener = e -> transitionEnd(e);
private static final StateMachine.TransitionExceptionListener transitionExceptionListener = e -> transitionException(e);
public static void main ( String[] args ) {
UntypedStateMachineBuilder builder = StateMachineBuilderFactory.create(StateMachineSample.class);
builder.externalTransition().from("A").to("B").on(FSMEvent.ToB).callMethod("fromAToB");
builder.onEntry("B").callMethod("ontoB");
UntypedStateMachine fsm = builder.newStateMachine("A");
attachListenersToFSM(fsm);
fsm.fire(FSMEvent.ToB, 10);
detachListenersFromFSM(fsm);
System.out.println("Current state is " + fsm.getCurrentState());
}
public static void attachListenersToFSM ( UntypedStateMachine fsm ) {
fsm.addStartListener(startListener);
fsm.addStateMachineExceptionListener(stateMachineExceptionListener);
fsm.addStateMachineListener(stateMachineListener);
fsm.addTransitionBeginListener(transitionBeginListener);
fsm.addTransitionCompleteListener(transitionCompleteListener);
fsm.addTransitionDeclinedListener(transitionDeclinedListener);
fsm.addTransitionEndListener(transitionEndListener);
fsm.addTransitionExceptionListener(transitionExceptionListener);
}
public static void detachListenersFromFSM ( UntypedStateMachine fsm ) {
fsm.removeTransitionExceptionListener(transitionExceptionListener);
fsm.removeTransitionEndListener(transitionEndListener);
fsm.removeTransitionDecleindListener(transitionDeclinedListener);
fsm.removeTransitionCompleteListener(transitionCompleteListener);
fsm.removeTransitionBeginListener(transitionBeginListener);
fsm.removeStateMachineListener(stateMachineListener);
fsm.removeStateMachineExceptionListener(stateMachineExceptionListener);
fsm.removeStartListener(startListener);
}
private static void started ( StateMachine.StartEvent e) {
}
private static void stateMachineEvent ( StateMachine.StateMachineEvent e) {
}
private static void stateMachineException ( StateMachine.StateMachineExceptionEvent e) {
}
private static void transitionBegin ( StateMachine.TransitionBeginEvent e) {
}
private static void transitionComplete ( StateMachine.TransitionCompleteEvent e) {
}
private static void transitionDeclined ( StateMachine.TransitionDeclinedEvent e) {
}
private static void transitionEnd (StateMachine.TransitionEndEvent e) {
}
private static void transitionException (StateMachine.TransitionExceptionEvent e) {
}
@StateMachineParameters( stateType = String.class, eventType = FSMEvent.class, contextType = Integer.class )
static class StateMachineSample extends AbstractUntypedStateMachine {
protected void fromAToB ( String from, String to, FSMEvent event, Integer context ) {
System.out.println("Transition from '" + from + "' to '" + to + "' on event '" + event + "' with context '" + context + "'.");
}
protected void ontoB ( String from, String to, FSMEvent event, Integer context ) {
System.out.println("Entry State \'" + to + "\'.");
}
}
enum FSMEvent {
ToA, ToB, ToC, ToD
}
}
from squirrel.
I just fixed the issue. Please try latest snapshot version.
from squirrel.
I've tested the latest snapshot and it is working correctly.
Thank you.
from squirrel.
Related Issues (20)
- 当callMethod方法找不到时会兜底使用Action.DUMMY_ACTION的考虑
- 请问有使用squirrel实现多个状态机的例子么
- 当 whenMvel 方法执行了不正确格式的 mvel 表达式时,抛出的是 NullPointerException 错误 HOT 1
- Identification mechanism for transitions
- Set id of state machine HOT 3
- 指定的callMethod方法没执行
- CVE-2018-8088
- AbstractStateMachine.canAccept(E event) does not work for events acceptable from parent state
- Event firing has race conditions
- ConcurrentModificationException on event firing
- 为什么没有中文文档呢
- 同学,您这个项目引入了10个开源组件,存在1个漏洞,辛苦升级一下 HOT 1
- [Transition exception] To state same as From state if transition is not defined on defined event
- fire() 执行中,再获取状态机实例的当前状态时会被锁住
- parallel fire event, get exception: The state machine is already terminated. HOT 1
- event 处理并发安全咨询 HOT 1
- Race condition upon the instantiation of declarative state machines
- builder.transitions() not support from(A).to(B).onAmont(E1,E2...)
- 请问下该状态机实例有状态吗?是线程安全的吗?
- when biz code occurs an exception , here will lost StackTrace HOT 1
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from squirrel.