还是刚才的以二级审批请假流程为例。

绘制流程

首先创建 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 文件来加载:

@Overridepublic void configure(StateMachineModelConfigurer<String, String> model) throws Exception {model.withModel().factory(modelFactory());}@Beanpublic StateMachineModelFactory<String, String> modelFactory() {// 测试二级审批请假流程UmlStateMachineModelFactory factory = new UmlStateMachineModelFactory("classpath:model.uml");factory.setStateMachineComponentResolver(stateMachineComponentResolver());return factory;}

注意,这里 States 和 Events 的类型都变成了 String,毕竟在 UML 中不太好定义类型。
如果要注册 Action 或者 Guard,可以通过 Resolver 进行:

    @Beanpublic 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>() {@Overridepublic void execute(StateContext<String, String> context) {}};}public Guard<String, String> myGuard() {return new Guard<String, String>() {@Overridepublic 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 图。

Spring StateMachine(2) UML状态图支持相关推荐

  1. UML状态图的实用C/C++设计(QP状态机)-笔记一

    QP官网网址:http://www.state-machine.com 本书下载地址: 笔记有点乱,没办法,书里也是断断续续的介绍. UML: UML状态图:状态用节点表示,转换用弧线连接在节点间.状 ...

  2. Spring Statemachine 简介

    Spring Statemachine 简介 Spring Statemachine是Spring官方提供的一个框架,供应用程序开发人员在Spring应用程序中使用状态机.支持状态的嵌套(substa ...

  3. Spring系列学习之Spring Statemachine状态机

    英文原文:https://projects.spring.io/spring-statemachine/ 目录 快速开始 Builder JavaConfig 版本 资源 实战 Spring Stat ...

  4. spring statemachine的企业可用级开发指南1-说些废话

    2019独角兽企业重金招聘Python工程师标准>>> 1.背景 在我打算学习spring statemachine的时候,我几乎看过了所有网上的中文教程,基本上都处于浅尝辄止的阶段 ...

  5. Spring StateMachine,教你快速实现一个状态机

    来源:http://t.cn/RIxCXiO Spring StateMachine框架可能对于大部分使用Spring的开发者来说还比较生僻,它的主要功能是帮助开发者简化状态机的开发过程,让状态机结构 ...

  6. Spring Statemachine TODO

    为什么80%的码农都做不了架构师?>>>    编者注 之前自己实现的完整的有限状态机,具有事件能够传值的特点,个人很喜欢.最近又需要实现有限状态机,对于值传递没有要求,则可以使用通 ...

  7. 【转】超详细的UML状态图符号,初学者也能轻松看懂状态图

    UML状态图,用于显示状态机,即描述一个对象所处的可能状态以及状态之间的转移.用状态图建模可以帮助开发人员分析复杂对象的各种状态的转换,以及对象何时执行怎样的动作.那状态图又是怎样表示这些信息的呢?要 ...

  8. 使用Spring StateMachine框架实现状态机

    Spring StateMachine框架可能对于大部分使用Spring的开发者来说还比较生僻,该框架目前差不多也才刚满一岁多.它的主要功能是帮助开发者简化状态机的开发过程,让状态机结构更加层次化.前 ...

  9. k8s springboot 文件_Springboot整合Spring Cloud Kubernetes读取ConfigMap支持自动刷新配置的教程...

    1 前言 欢迎访问南瓜慢说 www.pkslow.com获取更多精彩文章! Docker & Kubernetes相关文章:容器技术 之前介绍了Spring Cloud Config的用法,但 ...

最新文章

  1. 估值被砍700亿美元后,Waymo发重磅公开信:即将推出全自动驾驶打车服务
  2. suricata规则
  3. Linux脚本统计指定目录下文件和文件夹数量
  4. HTML5自定义播放器(简式)
  5. CodeForces - 1321B Journey Planning(思维)
  6. 基于Bounding Box的激光点云聚类
  7. log4j1升级log4j2
  8. wp10 手机 部署linux,【图片】02-15【吐槽】【转】win10手机端直接安装xap教程!【windowsphone吧】_百度贴吧...
  9. ERP系统测试用例设计
  10. 统计学三大相关系数之皮尔森(pearson)相关系数
  11. 模糊控制(一)模糊控制简介及数学基础
  12. Linux下C语言开发
  13. 推特狗狗档案数据集清洗分析及可视化
  14. Selenium_获取相对坐标
  15. matlab 浮雕算法,photoshop图像滤镜——浮雕算法(含matlab代码)
  16. let和const的区别
  17. redhat7磁盘扩容详细步骤
  18. java部门管理_系统管理模块_部门管理_实现基本的增删改查功能
  19. 解决小程序Uncaught ReferenceError: __wxConfig is not define的问题
  20. 1024: 手机话费

热门文章

  1. 拆书帮第14期训练营——作业十一:如何复盘
  2. android加载efi分区,节约磁盘空间! 删除安卓 EFI-PE分区教程
  3. 等保2.0 二级和三级安全设备拓扑图
  4. 360、腾讯管家安装蓝屏问题解决方案
  5. 【艾琪出品】-【数据结构】测试题系列一,无向图的邻接矩阵、北京景点查询系统(含部分答案)
  6. cf不能全屏win7的解决方法_Win7玩穿越火线总自动退出如何解决 win7系统玩cf自动退出的解决方法...
  7. MeterSphere 至善篇
  8. 解决MySQL导入Excel无法打开Excel的问题
  9. 一、科大软件工程(孟宁)(1)
  10. Seaborn使用regplot函数可视化散点图并添加回归曲线、移除默认的回归曲线置信区间(Scatter plot with regression line、Remove CI band)