在spring state machine

时间:2016-08-10 09:37:57

标签: spring-statemachine

我试图使用Papyrus从UML模型中构建一个状态机。 使用DefaultStateMachineComponentResolver重新注册每个阶段的entryActions,以解析我的spring应用程序中的各个EntryAction类。 我的要求是

1)在CS阶段,执行应该在获得触发事件SUCCESS时分叉到两个线程。

2)在一个线程中,DE1和TE1应该顺序执行,而在另一个线程中,DE2和TE2应该顺序执行

3)只有当两个线程都成功执行时才会发生转换到END状态, 即,从TE1开始,转换应该发生加入由事件SUCCESS发出信号的状态,并且从TE2发生转换应该发生加入由事件SUCCESS发出信号的状态

4)即。在成功执行2个线程后,应该转换到END状态。

5)在任何任务失败时执行每个阶段(任务在EntryAction类中编写),   状态机应该导航到END状态,使​​用的信号是FAILURE,TERMINATED(根据发生的错误的严重程度)

以下是我用于构建状态机和触发器执行的代码

Builder<String, String> builder = StateMachineBuilder
        .<String, String> builder();
builder.configureConfiguration()
.withConfiguration()
.autoStartup(false)
.listener(listener())
.beanFactory(
        this.applicationContext.getAutowireCapableBeanFactory());//.taskExecutor(taskExecutor());


DefaultStateMachineComponentResolver<String, String> resolver = new DefaultStateMachineComponentResolver<>();
resolver.registerAction("startEntryAction", this.startEntryAction);
resolver.registerAction("apEntryAction", this.apEntryAction);
resolver.registerAction("psEntryAction", this.psEntryAction);
//all entry action classed are registered
...
...
UmlStateMachineModelFactory umlStateMachineModelFactory = new UmlStateMachineModelFactory("classpath:model.uml");
umlStateMachineModelFactory.setStateMachineComponentResolver(resolver);
builder.configureModel().withModel().factory(umlStateMachineModelFactory);

StateMachine<String, String> stateMachine = builder.build();
stateMachine.start()

我遇到的问题

1)使用taskExecutor时,状态机执行没有开始。

2)在注释掉taskExecutor后,触发了exectuion,在控制台中我从entryAction类中获取了日志。

3)在每个入门操作类中,我刚刚添加了以下代码以转换到下一个状态,并用于记录目的

@Override
    public void execute(StateContext<String, String> paramStateContext) {
        LOGGER.debug("Start State entered! ");
        paramStateContext.getStateMachine().sendEvent("SUCCESS"); 
    }

4)但问题是在分析日志后从未输入TE1状态。    我的要求是在执行TE1EntryAction和TE2EntryAction中的任务后输入END状态

请在下面找到日志

[![enter image description here][1]][1]19:03:54.963 DEBUG o.i.r.p.a.StartEntryAction - Start State entered! 
    19:03:55.007 DEBUG o.i.r.p.a.APEntryAction - AP State entered! 
    19:03:55.007 DEBUG o.i.r.p.a.PSEntryAction - PS State entered! 
    19:03:55.007 DEBUG o.i.r.p.a.PBEntryAction - PB State entered! 
    19:03:55.007 DEBUG o.i.r.p.a.CSEntryAction - CS State entered! 
    19:03:55.007 DEBUG o.i.r.p.a.DE1EntryAction - DE1 State entered! 
    19:03:55.007 DEBUG o.i.r.p.a.DE2EntryAction - DE2 State entered! 
    19:03:55.007 DEBUG o.i.r.p.a.TE2EntryAction - TE2 State entered! 
    19:03:55.023 DEBUG o.i.r.p.a.EndStateEntryAction - END State entered! 

我创建的UML模型中是否存在问题。 如果是这样,状态图应该是什么样的

非常感谢你的帮助。

enter image description here

1 个答案:

答案 0 :(得分:0)

至少你的fork / join是错误的,因为你没有使用正交区域的那些。

simple-forkjoin-chart

上面的来源是simple-forkjoin.uml

我不确定为什么纸莎草纸允许你像uml规范明确指出那样画叉/连接:

  

Fork Pseudostates用于将传入的Transition转换为两个或多个终止的Transition   复合状态的正交区域中的顶点。

如果用户试图在不使用区域的情况下添加分支/连接,我应该添加模型验证程序。

此外,如果机器正在等待加入,我不确定从TE2过渡到END会发生什么情况,所以我会尽量避免这种情况。