链接: 状态机和工作流的区别.
链接: 状态机引擎选型.
链接: 彻底搞懂Spring状态机原理,实现订单与物流解耦.
链接: spring statemachine收录.
链接: spring statemachine的企业可用级开发指南.
链接: Spring Statemachine 简介.
链接: 实现一个状态机引擎,教你看清DSL的本质.
链接: COLA下的cola-statemachine状态机.
链接: 爱奇艺团队-领域驱动设计框架Axon实践.
链接: COLA 4.0:应用架构的最佳实践.
链接: 阿里高级技术专家谈开源DDD框架:COLA4.1,分离架构和组件(下).
链接: 【架构设计】无状态状态机在代码中的实践.

状态机框架

  • Spring Statemachine (重量级选手)1.2k+ star.
  • squirrel-foundation(松鼠)1.8k+ star.
  • cola-statemachine (可乐)6.6k+ star.

springboot合cola-statemachine 4.0.1

cola-statemachine(阿里出品)

github链接: cola-components.
gitcode链接: cola-components.

<dependency><groupId>com.alibaba.cola</groupId><artifactId>cola-component-statemachine</artifactId><version>4.0.1</version><type>jar</type>
</dependency>
package com.zm;import com.alibaba.cola.statemachine.Action;
import com.alibaba.cola.statemachine.Condition;
import com.alibaba.cola.statemachine.StateMachine;
import com.alibaba.cola.statemachine.StateMachineFactory;
import com.alibaba.cola.statemachine.builder.StateMachineBuilder;
import com.alibaba.cola.statemachine.builder.StateMachineBuilderFactory;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;@Slf4j
public class StateMachineTest {static String MACHINE_ID1 = "TestStateMachine1";static String MACHINE_ID2 = "TestStateMachine2";static String MACHINE_ID3 = "TestStateMachine3";static String MACHINE_ID4 = "TestStateMachine4";static String MACHINE_ID5 = "TestStateMachine5";static enum States {/*** 申请*/APPLY(1,"申请"),/***初审*/FIRST_TRIAL(2,"初审"),/***终审*/FINAL_JUDGMENT(3,"终审"),/***移出*/REMOVE(4,"移出");States(Integer value, String name) {this.value = value;this.name = name;}private final Integer value;private final String name;public Integer getValue() {return value;}public String getName() {return name;}}static enum Events {/*** 保存申请*/SAVE_APPLICATION,/*** 提交申请*/SUBMIT_APPLICATION,/*** 审核通过*/AUDIT_PASS,/*** 审核退回*/AUDIT_REJECT}/*** 参数*/static class Context{String operator = "flw";String entityId = "7758258";String name = "zhoumin";}@Testpublic void test(){testExternalTransitionNormal();testInternalNormal();testExternalTransitionsNormal();testExternalTransitionNormal1();testExternalTransitionNormal2();StateMachine<States, Events, Context> stateMachine1 = StateMachineFactory.get(MACHINE_ID1);StateMachine<States, Events, Context> stateMachine2 = StateMachineFactory.get(MACHINE_ID2);StateMachine<States, Events, Context> stateMachine3 = StateMachineFactory.get(MACHINE_ID3);System.out.println(stateMachine1.generatePlantUML());System.out.println(stateMachine2.generatePlantUML());System.out.println(stateMachine3.generatePlantUML());System.out.println(StateMachineFactory.get(MACHINE_ID4).generatePlantUML());System.out.println(StateMachineFactory.get(MACHINE_ID5).generatePlantUML());}/*** State:状态* Event:事件,状态由事件触发,引起变化* Transition:流转,表示从一个状态到另一个状态* External Transition:外部流转,两个不同状态之间的流转* Internal Transition:内部流转,同一个状态之间的流转* Condition:条件,表示是否允许到达某个状态* Action:动作,到达某个状态之后,可以做什么* StateMachine:状态机* ————————————————* 版权声明:本文为CSDN博主「张建飞(Frank)」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。* 原文链接:https://blog.csdn.net/significantfrank/article/details/104996419*/@Testpublic void testExternalTransitionNormal(){// 第一步:生成一个状态机builderStateMachineBuilder<States, Events, Context> builder = StateMachineBuilderFactory.create();// 第二步:设置一个外部状态转移类型的builder,并设置from\to\on\when\performbuilder.externalTransition()    // 外部状态流转.from(States.APPLY)     // 起始状态:申请.to(States.FIRST_TRIAL)        // 目的状态:初审.on(Events.SUBMIT_APPLICATION)       // 事件:提交申请.when(checkCondition()) // 流转需要校验的条件,校验不通过不会进行doAction.perform(doAction());   // 执行流转操作 这个action 我们可以按自己所需修改,比如这种Action<R,T> service的方法Service::method// 第三步:设置状态机的id和ready,并在StateMachineFactory中的stateMachineMap进行注册builder.build(MACHINE_ID1);// 第四步:触发状态机StateMachine<States, Events, Context> stateMachine = StateMachineFactory.get(MACHINE_ID1);stateMachine.showStateMachine();// 通过状态机执行 待审核状态执行审核操作,States target1 = stateMachine.fireEvent(States.APPLY, Events.SUBMIT_APPLICATION, new Context());}@Testpublic void testExternalTransitionNormal1(){StateMachineBuilder<States, Events, Context> builder = StateMachineBuilderFactory.create();builder.externalTransition().from(States.FIRST_TRIAL).to(States.FINAL_JUDGMENT).on(Events.AUDIT_PASS).when(checkCondition()).perform(doAction());builder.build(MACHINE_ID4);}@Testpublic void testExternalTransitionNormal2(){StateMachineBuilder<States, Events, Context> builder = StateMachineBuilderFactory.create();builder.externalTransition().from(States.FINAL_JUDGMENT).to(States.REMOVE).on(Events.AUDIT_PASS).when(checkCondition()).perform(doAction());builder.build(MACHINE_ID5);}/*** 状态在申请时 可以进行保存*/@Testpublic void testInternalNormal(){StateMachineBuilder<States, Events, Context> builder = StateMachineBuilderFactory.create();// 内部流转 internal transition// 假设现在只是用户补全资料,只需要进行一些更新数据操作,不需要状态流转。这种需求可以通过内部状态流转实现builder.internalTransition().within(States.APPLY).on(Events.SAVE_APPLICATION).when(checkCondition()).perform(doAction());StateMachine<States, Events, Context> stateMachine = builder.build(MACHINE_ID2);// 打印状态机里面的流程流转图谱stateMachine.showStateMachine();// 通过状态机执行 待审核状态执行审核操作,States target = stateMachine.fireEvent(States.APPLY, Events.SAVE_APPLICATION, new Context());}/*** 只要退回则回到申请箱的状态*/@Testpublic void testExternalTransitionsNormal(){StateMachineBuilder<States, Events, Context> builder = StateMachineBuilderFactory.create();// external transitions 任意一个状态builder.externalTransitions().fromAmong(States.FIRST_TRIAL, States.FINAL_JUDGMENT).to(States.APPLY).on(Events.AUDIT_REJECT).when(checkCondition()).perform(doAction());StateMachine<States, Events, Context> stateMachine = builder.build(MACHINE_ID3);// 打印状态机里面的流程流转图谱stateMachine.showStateMachine();// 通过状态机执行 待审核状态执行审核操作,States target1 = stateMachine.fireEvent(States.FIRST_TRIAL, Events.AUDIT_REJECT, new Context());States target2 = stateMachine.fireEvent(States.FINAL_JUDGMENT, Events.AUDIT_REJECT, new Context());}/*** 条件,表示是否允许到达某个状态*/private Condition<StateMachineTest.Context> checkCondition() {return (ctx) -> true; // 默认返回true}/*** 动作,到达某个状态之后,可以做什么*/private Action<StateMachineTest.States, StateMachineTest.Events, StateMachineTest.Context> doAction() {return (from, to, event, ctx)-> log.info(ctx.operator+" is operating "+ctx.entityId+" from:"+from.getName()+" to:"+to.getName()+" on:"+event+";"+ctx.name);}}

可以生成PlantUML格式

stateMachine.generatePlantUML();

springboot合Spring Statemachine 2.x

待续~

生成PlantUML图

网站链接: planttext.

idea插件

idea安装 PlantUML插件
idea直接安装:File -> Settings -> Plugins 搜索 PlantUML ,找到 PlantUML integration 并安装

经过安装包引入

下载插件包安装:地址http://plugins.jetbrains.com/plugin/7017-plantuml-integration我已经下载好,能够使用:plantuml4idea.zipctrl+ alt + s 打开setting,搜索plugins,

cola架构快速生成

链接: 阿里云代码生成.

springboot状态机模式相关推荐

  1. 状态模式 处理订单状态_将状态机模式实现为流处理器

    状态模式 处理订单状态 在我的上一个博客中,我说过我真的以为某些"四人行"(GOF)模式已经过时了,如果不是过时的话肯定不受欢迎. 特别是我说过StateMachine没什么用,因 ...

  2. 将状态机模式实现为流处理器

    在我的上一个博客中,我说我真的以为某些"四人行"(GOF)模式已经过时了,如果不是过时的话肯定不受欢迎. 特别是我说过StateMachine不是那么有用,因为您通常会想到另一种更 ...

  3. 状态机设计模式_设计模式-代理/状态机模式

    代理模式 是使率非常高的模式: 为其它对象提供一种代理以控制这个对象的访问.该模式也称为委托模式,在使用的时候代理模式可以为我们提供非常好的访问控制. 如下代码 interface IGamePlay ...

  4. 设计模式的C语言应用-状态机模式-第二章

    模式介绍 状态(state)模式是C语言实现相当常用的模式,也是能够在C语言***现出来的最显性的模式之一.在面向对象里,状态模式允许一个对象在内部状态改变的时候改变其行为. 状态用法很多,最常见的是 ...

  5. c语言设计模式代码完整实现-状态机模式

    模式介绍 状态(state)模式是C语言实现相当常用的模式,也是能够在C语言***现出来的最显性的模式之一.在面向对象里,状态模式允许一个对象在内部状态改变的时候改变其行为. 状态用法很多,最常见的是 ...

  6. vivado 如何设置安全状态机模式

    首先我们要明白为什么要设置安全状态机模式. 具体可以参考以下文章 [doc] FPGA设计中状态机安全性研究 - 豆丁网 (docin.com) 我们在写状态机的时候,会添加default语句(vhd ...

  7. 关于ospf几种状态机模式的停留

    通过ospf的几种状态机模式的停留,进一步深入熟悉ospf建立邻居和领接的过程 R1与R2建立邻接的过程通过init - 2-way - exstart - exchange - loading - ...

  8. 浅谈设计模式之状态机模式

    一. 为什么要引入状态机模式? 系统状态的变化引起实际行为的改变,因此我们需要在系统的主任务中判断他们处于哪一个状态,使用if-else if-else或者switch-case分支结构可以很好的解决 ...

  9. 设计模式—状态机模式

    文章目录 1.概要 定义 四要素 2. 状态机模式实现 1.概要 定义 状态机由状态寄存器和组合逻辑电路构成,能够根据控制信号按照预先设定的状态进行状态转移,是协调相关信号动作.完成特定操作的控制中心 ...

最新文章

  1. 1040 Longest Symmetric String 需再做
  2. 中国碳纤维风电叶片行业“十四五”发展规划及投资可行性分析报告2022-2028年版
  3. 原创 - 前后端分离,以及前端的一些操作
  4. 景霄讲解Python部分内部实现
  5. C:\WINDOWS\system32\drivers\etc\hosts
  6. memcache简单操作
  7. 蓝图出炉:大家将能够利用英伟达技术打造自己的自动驾驶车辆
  8. PCB制图 | Altium Designer 20软件汉化
  9. ​关于技术变现的几点思考
  10. 计算二叉树叶子结点数
  11. 苹果iOS申请个人开发者账号注册教程
  12. 双盘转子动力学仿真c语言程序,[转载]基于ANSYS经典界面的双转子电机的转子动力学仿真...
  13. 2020建模穿越沙漠第一关python代码
  14. zookeeper storm kafka开机简易启动脚本
  15. 《阿里云前端技术周刊》第二期
  16. Java中mongodb指定DB通过aggregate聚合查询操作示例
  17. 【技术邻】基于有限元方法的整车风噪仿真分析
  18. Windows 11 移动文件夹错误 0x800700E1 无法成功完成操作
  19. 【UV打印机】PrintExp打印软件教程(四)-设置校准电压
  20. 开源的第三方支付系统

热门文章

  1. csv文档转为tsv文档-csv to tsv
  2. linux io apic,linux-kernel – IO-APIC级别与PCI-MSI-X之间的差异
  3. 深入分析零拷贝的原理,彻底掌握Netty、Kafka、RocketMQ高效率读写的秘诀
  4. 同样嗑B站6个月,被室友吊打 35K Offer!
  5. [论文阅读](图像/视频质量评价系列)
  6. 咸鱼ESP32实例—MQTT
  7. vue+elemnt ul 图片上传隐藏按钮+图片回显
  8. jsp调试java_[求助]jsp+javaBean调试环境问题!
  9. Git命令的使用(进阶版)
  10. java获取三个月之前时间与当前时间