状态机优势

1、状态机建立的控制中心是跟外界低耦合的,通过event通信;
2、控制中心所有的状态都是预设好的,不会超预料;
3、状态的跳转都是有设定控制条件的,会按照预设的转移路径运动;
4、状态机还非常容易的扩展和变更,支持因业务的发展而变更或扩展复杂业务流程。

Spring Boot StateMachine实现

1、加入依赖

<dependency><groupId>org.springframework.statemachine</groupId><artifactId>spring-statemachine-core</artifactId><version>1.2.0.RELEASE</version></dependency>

2、定义状态枚举和事件枚举

public enum States {UNPAID,                 // 待支付WAITING_FOR_RECEIVE,    // 待收货DONE                    // 结束
}
public enum Events {PAY,        // 支付RECEIVE     // 收货
}

3、完成状态机配置:状态机的初始状态和所有状态机的转移规则


@Configuration
//启用状态机功能
@EnableStateMachine
public class StateMachineConfig extends EnumStateMachineConfigurerAdapter<States, Events> {private Logger logger = LoggerFactory.getLogger(getClass());@Overridepublic void configure(StateMachineStateConfigurer<States, Events> states) throws Exception{//定义状态机中的状态states.withStates().initial(States.UNPAID) //初始状态.states(EnumSet.allOf(States.class));//指定使用上一步定义的所有状态作为该状态机的状态定义}@Overridepublic void configure(StateMachineTransitionConfigurer<States, Events> transitions) throws Exception{transitions.withExternal().source(States.UNPAID).target(States.WAITING_FOR_RECEIVE)  //指定状态来源和目标.event(Events.PAY)   //指定触发事件.and().withExternal().source(States.WAITING_FOR_RECEIVE).target(States.DONE).event(Events.RECEIVE);}@Overridepublic void configure(StateMachineConfigurationConfigurer<States, Events> config) throws Exception{config.withConfiguration().listener(listener());  //指定状态机的处理监听器}//创建状态监听器的实例,定义具体的状态迁移处理逻辑,在通常情况将该实例的定义放到独立的类定义中,用注入方式加载进来@Beanpublic StateMachineListener<States, Events> listener(){return new StateMachineListenerAdapter<States, Events>(){@Overridepublic void transition(Transition<States, Events> transition){if(transition.getTarget().getId() == States.UNPAID){logger.info("订单创建,待支付");return;}if(transition.getSource().getId() == States.UNPAID&& transition.getTarget().getId() == States.WAITING_FOR_RECEIVE){logger.info("用户完成支付,待收货");return;}if(transition.getSource().getId() == States.WAITING_FOR_RECEIVE&& transition.getTarget().getId() == States.DONE){logger.info("用户已收货,订单完成");}}};}
}

4、创建应用主类来完成整个流程:


package com.lyd;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.statemachine.StateMachine;@SpringBootApplication
public class Application implements CommandLineRunner{public static void main(String[] args) {SpringApplication.run(Application.class, args);}@Autowiredprivate StateMachine<States, Events> stateMachine;@Overridepublic void run(String... args){stateMachine.start();stateMachine.sendEvent(Events.PAY);stateMachine.sendEvent(Events.RECEIVE);}
}

整个状态的调度逻辑主要依靠配置方式的定义,而所有的业务逻辑操作都被定义在了状态监听器中,其实状态监听器可以实现的功能远不止上面我们所述的内容,它还有更多的事件捕获

注解监听器
对于状态监听器,Spring StateMachine还提供了优雅的注解配置实现方式,所有StateMachineListener接口中定义的事件都能通过注解的方式来进行配置实现。比如,我们可以将之前实现的状态监听器用注解配置来做进一步的简化。


package com.lyd;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.statemachine.annotation.OnTransition;
import org.springframework.statemachine.annotation.OnTransitionEnd;
import org.springframework.statemachine.annotation.OnTransitionStart;
import org.springframework.statemachine.annotation.WithStateMachine;/*** 该配置实现了com.lyd.StateMachineConfig类中定义的状态机监听器实现。 */
@WithStateMachine
public class EventConfig {private Logger logger = LoggerFactory.getLogger(getClass());@OnTransition(target = "UNPAID")public void create(){logger.info("订单创建,待支付");}@OnTransition(source = "UNPAID", target = "WAITING_FOR_RECEIVE")public void pay() {logger.info("用户完成支付,待收货");}@OnTransitionStart(source = "UNPAID", target = "WAITING_FOR_RECEIVE")public void payStart() {logger.info("用户完成支付,待收货: start");}@OnTransitionEnd(source = "UNPAID", target = "WAITING_FOR_RECEIVE")public void payEnd() {logger.info("用户完成支付,待收货: end");}@OnTransition(source = "WAITING_FOR_RECEIVE", target = "DONE")public void receive() {logger.info("用户已收货,订单完成");}
}

状态机实现原理

SpringBoot状态机相关推荐

  1. springboot状态机模式

    链接: 状态机和工作流的区别. 链接: 状态机引擎选型. 链接: 彻底搞懂Spring状态机原理,实现订单与物流解耦. 链接: spring statemachine收录. 链接: spring st ...

  2. springboot+状态机

    最近好多业务都是流程状态的传递,借此机会写词文章,记录一下,什么样的场景设计需要我们的状态机: 目前市场流行的状态机:  1.Spring Statemachine 2.阿里COLA4.4 状态机框架 ...

  3. Springboot整合squirrel-foundation状态机

    目录 一. 快速入门 1 . maven 2 . 快速开始 3 . Fluent Api 4 . 状态机四要素 5 . 状态机构建器 6 . 状态机转换操作(代码配置方式) 7 . 状态机转换操作(注 ...

  4. Spring-boot state-machine 状态机 papyrus 详细操作步骤

    之所以写这篇文章是我们公司需要用到,然后百度和其他搜索引擎都没有相关过多详细的介绍和操作步骤,所以我写一篇有关eclipse的状态机开发 前提要求:  需要安装eclipse的papyrus插件 插件 ...

  5. Springboot + redis + 注解 + 拦截器来实现接口幂等性校验

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者:wangzaiplus www.jianshu.com/p/ ...

  6. springboot + redis + 注解 + 拦截器 实现接口幂等性校验

    点击上方"方志朋",选择"设为星标" 做积极的人,而不是积极废人 来源:https://www.jianshu.com/p/6189275403ed 一.概念 ...

  7. springboot token_Springboot接口幂等性基于token实现方案

    什么是接口幂等 幂等(idempotent.idempotence)是一个数学与计算机学概念,常见于抽象代数中,即f(f(x)) = f(x).简单的来说就是一个操作多次执行产生的结果与一次执行产生的 ...

  8. c# 基于layui的通用后台管理系统_【SpringBoot】三十三、SpringBoot+LayUI后台管理系统开发脚手架...

    点击蓝色字免费订阅,每天收到这样的好信息 前言:最近有不少粉丝关注本公众号.并且我已经成功开通了流量主同时会赚一点点广告费,我打算每个月把这部分钱拿出来给大家买点书刊,算是给大家一点福利吧.大家想买什 ...

  9. redis 判断存在性_实战 | springboot+redis+拦截器 实现接口幂等性校验

    来源:https://www.jianshu.com/p/6189275403ed 一.概念 幂等性, 通俗的说就是一个接口, 多次发起同一个请求, 必须保证操作只能执行一次 比如: 订单接口, 不能 ...

最新文章

  1. Java 一维数组作为参数和返回值
  2. 算法导论chapter6 堆排序的代码
  3. 一地鸡毛 OR 绝地反击,2019年区块链发展指南
  4. 数据库------求职必看
  5. java 如何把源码导出为jar包,以及如何使用导出的jar包
  6. 前端学习(3069):vue+element今日头条管理-loding处理
  7. 个人知识库的分类目录_搭建个人知识体系,让印象笔记成为我们的“第二大脑”!...
  8. 黑鲨helo支持html吗,黑鲨游戏手机Helo综合评测 到底值不值得买
  9. word插入目录右边对不齐
  10. 通过网店管家抓取奇门淘系订单数据
  11. python 生信分析_提速Python!无论生信分析还是数据分析
  12. 怎样把计算机里的W0rd放到电脑桌面,当电脑桌面没有WORD文档时怎么打开WORD文档...
  13. Mysql 实现行转列功能
  14. Day45. 数据分析实战(1):超市运营数据分析
  15. 【Android面试题】准备、hr面试问题总结
  16. JNI:Fatal signal 11 (SIGSEGV) at 0x00000008 (code=1)错误的一点认识
  17. 游戏辅助制作核心--植物大战僵尸逆向之阳光修改(一)
  18. [SCOI2016]幸运数字
  19. 邮件退信RCPT TO command问号
  20. 说说arcgis的*.cpg文件

热门文章

  1. C++获取CPUID
  2. 5778. 【NOIP提高A组模拟2018.8.8】没有硝烟的战争
  3. JVM家庭成员盘点及各自职能介绍
  4. 微服务技术初探:基于IDEA使用Maven构建SpringCloud项目
  5. h5 先加载小图_H5测试搭建知识宝典
  6. express-formidable与bodyParser区别err:strem is not read
  7. java基于微信小程序的在线考试系统 uniapp 小程序
  8. java数组添加 西游记,Java基础上机题
  9. CAD看图移动端为什么这么火?
  10. php sg11加密方式,SG11加密使用、安装配置说明