我试图使用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模型中是否存在问题。 如果是这样,状态图应该是什么样的
非常感谢你的帮助。
答案 0 :(得分:0)
至少你的fork / join是错误的,因为你没有使用正交区域的那些。
上面的来源是simple-forkjoin.uml
我不确定为什么纸莎草纸允许你像uml规范明确指出那样画叉/连接:
Fork Pseudostates用于将传入的Transition转换为两个或多个终止的Transition 复合状态的正交区域中的顶点。
如果用户试图在不使用区域的情况下添加分支/连接,我应该添加模型验证程序。
此外,如果机器正在等待加入,我不确定从TE2
过渡到END
会发生什么情况,所以我会尽量避免这种情况。