内容简介:版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/kmyhy/article/details/84787556
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/kmyhy/article/details/84787556
还是刚才的以二级审批请假流程为例。
绘制流程
首先创建 Papyrus 项目,选择 StateMachine 模板,绘制流程图如下:
然后创建 6 个 signal event 和与之绑定的 signal :
注意,在 Papyrus 图中,除了 State (状态) 和 Transition(迁移)之外,还有 Signal 和 Signal Event 的概念,它们对应于 StateMachine 中的 Event(事件)。其中 Signal 就是事件的名字(字符串常量)。
将 Tansition 和 Signal Event 绑定(设置 trigger)。
加载 uml 状态图
将 Papyrus 生成的 uml 文件放到 idea 的 resource 目录。
因为 State、Event 和 Transition 都定义在 UML 中了,所以 States 枚举和 Events 枚举不再需要,状态机的配置也简化了,直接从 UML 文件来加载:
@Override public void configure(StateMachineModelConfigurer<String, String> model) throws Exception { model .withModel() .factory(modelFactory()); } @Bean public StateMachineModelFactory<String, String> modelFactory() { // 测试二级审批请假流程 UmlStateMachineModelFactory factory = new UmlStateMachineModelFactory( "classpath:model.uml"); factory.setStateMachineComponentResolver(stateMachineComponentResolver()); return factory; }
注意,这里 States 和 Events 的类型都变成了 String,毕竟在 UML 中不太好定义类型。
如果要注册 Action 或者 Guard,可以通过 Resolver 进行:
@Bean public StateMachineComponentResolver<String, String> stateMachineComponentResolver() { DefaultStateMachineComponentResolver<String, String> resolver = new DefaultStateMachineComponentResolver<>(); resolver.registerAction("myAction", myAction()); resolver.registerGuard("myGuard", myGuard()); return resolver; } public Action<String, String> myAction() { return new Action<String, String>() { @Override public void execute(StateContext<String, String> context) { } }; } public Guard<String, String> myGuard() { return new Guard<String, String>() { @Override public boolean evaluate(StateContext<String, String> context) { return false; } }; }
发送事件
跟之前一样,发送事件使用状态机的 sendEvent。只不过 Event 的类型统统是字符串,而且必须在 UML 中定义为 Signal。
private BaseResponse sendEvent(String event,String leaveId){ BaseResponse result = new BaseResponse(); if(leaveId == null || leaveId.length()==0){ result.success = false; result.message = "leaveId 不能为空"; return result; } try { // 根据业务 id 获取状态 persister.restore(stateMachine,leaveId); result.success = stateMachine.sendEvent(event); // 持久化状态机 if (result.success) { persister.persist(stateMachine, leaveId); } JSONObject data = new JSONObject(); result.message = result.success ? "执行成功":"执行失败"; result.message = result.message + ",当前状态为:"+stateMachine.getState().getId(); data.put("leaveId",leaveId); data.put("event",event); data.put("state",stateMachine.getState().getId()); result.data = data; } catch (Exception e) { e.printStackTrace(); result.message = e.getMessage(); }finally { stateMachine.stop(); return result; } }
可以看到,通过 UML 方式绘制状态机,减少了在代码中定义 Event、State 和 Transition 的过程,但 UML 中必须通过额外的元素(Signal和 Signal Event)来定义事件,在目前来说 Spring StateMachine 只支持 Papyrus 绘制的 UML 图。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- Serverless 1.32.0 发布了,支持后端状态项生成与多域
- javascript – 有可能使用angularJs将状态从状态传递到状态吗?
- 前端状态管理与有限状态机
- 如何可视化需求状态和团队状态?
- 给 DSL 开个脑洞:无状态的状态机
- 基于有限状态机的广告状态管理方案及实现
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
PHP+MySQL八大动态Web应用实战
Jono Bacom / 吴连河、李剑 / 电子工业出版社 / 2008-6 / 68.00元
本书详细介绍了利用PHP+MySQL开发常见类型Web应用程序的完整设计和编码技术,并对整体设计与关键代码给予了细致、深入的剖析。其内容注重实践,提供了翔实完整的实战代码;思路独树一帜,突破过多描述语言细节的窠臼;行文风趣幽默,轻松调侃中将项目的完整设计过程分析得一清二楚。书中的示例项目完整而实用,读者甚至无需任何改动即可在实际中加以运用。. 本书适合对PHP/MySQL有初步了解但缺乏完整......一起来看看 《PHP+MySQL八大动态Web应用实战》 这本书的介绍吧!