【发布时间】:2016-06-16 10:17:37
【问题描述】:
我为错误处理做了所有设置
@PostConstruct
public void addStateMachineInterceptor() {
stateMachine.getStateMachineAccessor().withRegion().addStateMachineInterceptor(interceptor);
stateMachine.getStateMachineAccessor().doWithRegion(errorinterceptor);
}
创建拦截器来处理错误:
@Service
public class OrderStateMachineFunction<T> implements StateMachineFunction<StateMachineAccess<String, String>> {
@Override
public void apply(StateMachineAccess<String, String> stringStringStateMachineAccess) {
stringStringStateMachineAccess.addStateMachineInterceptor(
new StateMachineInterceptorAdapter<String, String>() {
@Override
public Exception stateMachineError(StateMachine<String, String> stateMachine,
Exception exception) {
// return null indicating handled error
return exception;
}
});
}
}
但是当我们从操作中抛出异常时,我看不到调用进入 OrderStateMachineFunction。
在该状态机以某种有线方式运行之后,就像它在 this.stateMachine.sendEvent(eventData); 之后停止调用 preStateChange 方法一样。从操作中抛出异常后,状态机似乎崩溃了。
@Service
public class OrderStateMachineInterceptor extends StateMachineInterceptorAdapter {
@Override
public void preStateChange(State newState, Message message, Transition transition, StateMachine stateMachine) {
System.out.println("Manish");
}
}
在尝试了一些之后,我发现如果我评论 resetStateMachine,它会按预期工作,但没有它我无法将当前状态通知状态机:
public boolean fireEvent(Object data, String previousState, String event) {
Message<String> eventData = MessageBuilder.withPayload(event)
.setHeader(DATA_KEY, data)
.build();
this.stateMachine.stop();
// this.stateMachine
// .getStateMachineAccessor()
// .withRegion()
// .resetStateMachine(new DefaultStateMachineContext(previousState, event, eventData.getHeaders(), null));
this.stateMachine.start();
return this.stateMachine.sendEvent(eventData);
}
【问题讨论】:
-
目前似乎无法进行错误处理,请参阅github.com/spring-projects/spring-statemachine/issues/183。至少,我一直无法让它工作。
标签: java spring spring-boot spring-statemachine