数字媒体应用 网站开发,wordpress付款后可见,程序开发培训,网站建设结构总结一、什么是状态机
状态机#xff0c;又称有限状态自动机#xff0c;是表示有限个状态以及在这些状态之间的转移和动作等行为的计算模型。状态机的概念其实可以应用的各种领域#xff0c;包括电子工程、语言学、哲学、生物学、数学和逻辑学等#xff0c;例如日常生活中的电…一、什么是状态机
状态机又称有限状态自动机是表示有限个状态以及在这些状态之间的转移和动作等行为的计算模型。状态机的概念其实可以应用的各种领域包括电子工程、语言学、哲学、生物学、数学和逻辑学等例如日常生活中的电梯、风扇、门闸机等都会涉及到多种状态随着动作的执行会进行状态的转移而在软件编程领域采用状态机的思路同样可以简化我们的设计流程会使代码的可读性和可维护性得到增加。 目前用的比较多的开源状态机如Spring StateMachine、Squirrel StateMachine以及阿里开源一款轻量的Cola-StateMachine本文主要介绍Spring的状态机的使用。 二、Spring状态机的核心概念
transition转换是原状态和目标状态之间的关系用于将状态机从一种状态转移到另一种状态source节点的当前状态target节点的目标状态event触发节点从当前状态到目标状态的动作如从State A 到 State Bguard也叫“门卫”当事件请求触发时可以定义校验规则用于校验是否可以执行后续actionaction用于实现当前节点对应的业务逻辑事件发生之后系统做出的反应withChoice当执行一个动作可能导致多种结果时可以选择使用choiceguard来跳转withInternal我们支持三种不同类型的转换externalinternal和local。转换时通过信号触发的该信号是发送到状态机的事件或计时器
三、Spring状态机使用示例
Spring StateMachine 是 Spring 官方提供的状态机实现。其核心组件如下
StateMachine状态机实例可以触发事件、执行状态转换并获取当前状态等信息StateMachineStateConfigurer用于配置状态定义状态机中的各种状态并指定每个状态的行为和属性StateMachineTransitionConfigurer用于配置状态之间的转换关系定义转换的触发事件、源状态、目标状态以及转换的条件和动作StateMachineConfigurationConfigurer状态机系统配置用于配置状态机的全局属性和行为包括状态机的执行模式、并发策略、监听器等StateMachineListenerAdapter事件监听器用于简化状态机事件监听器StateMachineEventListener的实现
这里还是以抽奖奖励状态转换为例奖励的状态转换图如下 环境准备
dependencygroupIdorg.springframework.statemachine/groupIdartifactIdspring-statemachine-starter/artifactIdversion2.5.0/version/dependency定义奖励状态以及事件的枚举类 public enum AwardState {INACTIVE, ACTIVE, PAUSE, FINISH
}public enum AwardEvent {AUTO_ACTIVATE, AUTO_FINISH, FINISH, PAUSE, RESUME
}状态机配置类
Configuration
EnableStateMachine
public class AwardStateMachineConfig extends EnumStateMachineConfigurerAdapterAwardState, AwardEvent {Autowiredprivate AwardStateMachineListener awardStateMachineListener;Overridepublic void configure(StateMachineStateConfigurerAwardState, AwardEvent states) throws Exception {states.withStates().initial(AwardState.INACTIVE).states(EnumSet.allOf(AwardState.class));}Overridepublic void configure(StateMachineTransitionConfigurerAwardState, AwardEvent transitions) throws Exception {transitions.withExternal().source(AwardState.INACTIVE).target(AwardState.ACTIVE).event(AwardEvent.AUTO_ACTIVATE).and().withExternal().source(AwardState.INACTIVE).target(AwardState.FINISH).event(AwardEvent.AUTO_FINISH).and().withExternal().source(AwardState.ACTIVE).target(AwardState.FINISH).event(AwardEvent.FINISH).and().withExternal().source(AwardState.ACTIVE).target(AwardState.PAUSE).event(AwardEvent.PAUSE).and().withExternal().source(AwardState.PAUSE).target(AwardState.ACTIVE).event(AwardEvent.RESUME).and().withExternal().source(AwardState.PAUSE).target(AwardState.FINISH).event(AwardEvent.FINISH);}Overridepublic void configure(StateMachineConfigurationConfigurerAwardState, AwardEvent config) throws Exception {config.withConfiguration().autoStartup(true).listener(awardStateMachineListener);}
}状态机监听器
Component
public class AwardStateMachineListener extends StateMachineListenerAdapterAwardState, AwardEvent {Overridepublic void transition(TransitionAwardState, AwardEvent transition) {System.out.println(状态转移 from transition.getSource().getId() to transition.getTarget().getId());}/*Overridepublic void stateChanged(StateAwardState, AwardEvent from, StateAwardState, AwardEvent to) {System.out.println(状态改变 from from.getId() to to.getId());}*/
}奖励服务类
Service
public class AwardStateMachineService {Resourceprivate StateMachineAwardState, AwardEvent stateMachine;public void autoActivate() {stateMachine.sendEvent(AwardEvent.AUTO_ACTIVATE);}public void autoFinish() {stateMachine.sendEvent(AwardEvent.AUTO_FINISH);}public void finish() {stateMachine.sendEvent(AwardEvent.FINISH);}public void pause() {stateMachine.sendEvent(AwardEvent.PAUSE);}public void resume() {stateMachine.sendEvent(AwardEvent.RESUME);}}测试
SpringBootTest
class AwardStatemachineApplicationTests {Autowiredprivate AwardStateMachineService awardStateMachineService;Autowiredprivate StateMachineAwardState, AwardEvent stateMachine;Testvoid awardStageTest() {// 发送事件自动激活抽奖awardStateMachineService.autoActivate();// 检查状态是否变为ACTIVEassert (stateMachine.getState().getId() AwardState.ACTIVE);// 发送事件暂停抽奖awardStateMachineService.pause();// 检查状态是否变为PAUSEassert (stateMachine.getState().getId() AwardState.PAUSE);// 发送事件恢复抽奖awardStateMachineService.resume();// 检查状态是否变为ACTIVEassert (stateMachine.getState().getId() AwardState.ACTIVE);// 发送事件结束抽奖awardStateMachineService.finish();// 检查状态是否变为FINISHassert (stateMachine.getState().getId() AwardState.FINISH);}}测试执行结果 可以看到 Spring 状态机很好的控制了奖励状态之间的流转。
总结本文主要介绍了Spring状态机的一些基本概念以及状态流转的使用方式Spring状态机一些高级的用法如状态的持久化、状态的并行parallelforkjoin、子状态机等会在后面文章更新。
参考 https://docs.spring.io/spring-statemachine/docs/2.0.2.RELEASE/reference/htmlsingle/#glossary 文章转载自: http://www.morning.wjdgx.cn.gov.cn.wjdgx.cn http://www.morning.plqkz.cn.gov.cn.plqkz.cn http://www.morning.yqtry.cn.gov.cn.yqtry.cn http://www.morning.gjfym.cn.gov.cn.gjfym.cn http://www.morning.pghry.cn.gov.cn.pghry.cn http://www.morning.kbbmj.cn.gov.cn.kbbmj.cn http://www.morning.ccyns.cn.gov.cn.ccyns.cn http://www.morning.kfjnx.cn.gov.cn.kfjnx.cn http://www.morning.qyrnp.cn.gov.cn.qyrnp.cn http://www.morning.rqnhf.cn.gov.cn.rqnhf.cn http://www.morning.bwqcx.cn.gov.cn.bwqcx.cn http://www.morning.zyffq.cn.gov.cn.zyffq.cn http://www.morning.qswws.cn.gov.cn.qswws.cn http://www.morning.rpkg.cn.gov.cn.rpkg.cn http://www.morning.qkrqt.cn.gov.cn.qkrqt.cn http://www.morning.vibwp.cn.gov.cn.vibwp.cn http://www.morning.pfgln.cn.gov.cn.pfgln.cn http://www.morning.chmkt.cn.gov.cn.chmkt.cn http://www.morning.kqbwr.cn.gov.cn.kqbwr.cn http://www.morning.yfddl.cn.gov.cn.yfddl.cn http://www.morning.yxwcj.cn.gov.cn.yxwcj.cn http://www.morning.eshixi.com.gov.cn.eshixi.com http://www.morning.5-73.com.gov.cn.5-73.com http://www.morning.mgzjz.cn.gov.cn.mgzjz.cn http://www.morning.ggnrt.cn.gov.cn.ggnrt.cn http://www.morning.mknxd.cn.gov.cn.mknxd.cn http://www.morning.xqjrg.cn.gov.cn.xqjrg.cn http://www.morning.mstbbs.com.gov.cn.mstbbs.com http://www.morning.bytgy.com.gov.cn.bytgy.com http://www.morning.mrbzq.cn.gov.cn.mrbzq.cn http://www.morning.mqtzd.cn.gov.cn.mqtzd.cn http://www.morning.nkyc.cn.gov.cn.nkyc.cn http://www.morning.qpnb.cn.gov.cn.qpnb.cn http://www.morning.xjwtq.cn.gov.cn.xjwtq.cn http://www.morning.mmplj.cn.gov.cn.mmplj.cn http://www.morning.dnconr.cn.gov.cn.dnconr.cn http://www.morning.yqqxj26.cn.gov.cn.yqqxj26.cn http://www.morning.lmzpk.cn.gov.cn.lmzpk.cn http://www.morning.gxhqt.cn.gov.cn.gxhqt.cn http://www.morning.qyqdz.cn.gov.cn.qyqdz.cn http://www.morning.hdrsr.cn.gov.cn.hdrsr.cn http://www.morning.fkyrk.cn.gov.cn.fkyrk.cn http://www.morning.tkrpt.cn.gov.cn.tkrpt.cn http://www.morning.lqjpb.cn.gov.cn.lqjpb.cn http://www.morning.zqybs.cn.gov.cn.zqybs.cn http://www.morning.ngcsh.cn.gov.cn.ngcsh.cn http://www.morning.ypqwm.cn.gov.cn.ypqwm.cn http://www.morning.tdfyj.cn.gov.cn.tdfyj.cn http://www.morning.zljqb.cn.gov.cn.zljqb.cn http://www.morning.feites.com.gov.cn.feites.com http://www.morning.bfbl.cn.gov.cn.bfbl.cn http://www.morning.gfnsh.cn.gov.cn.gfnsh.cn http://www.morning.pgmyn.cn.gov.cn.pgmyn.cn http://www.morning.qkcyk.cn.gov.cn.qkcyk.cn http://www.morning.hqwxm.cn.gov.cn.hqwxm.cn http://www.morning.wgbsm.cn.gov.cn.wgbsm.cn http://www.morning.xgcwm.cn.gov.cn.xgcwm.cn http://www.morning.qrsrs.cn.gov.cn.qrsrs.cn http://www.morning.jbmsp.cn.gov.cn.jbmsp.cn http://www.morning.dxsyp.cn.gov.cn.dxsyp.cn http://www.morning.qwhbk.cn.gov.cn.qwhbk.cn http://www.morning.tplht.cn.gov.cn.tplht.cn http://www.morning.gwjqq.cn.gov.cn.gwjqq.cn http://www.morning.ngcth.cn.gov.cn.ngcth.cn http://www.morning.qhln.cn.gov.cn.qhln.cn http://www.morning.rtbhz.cn.gov.cn.rtbhz.cn http://www.morning.zxcny.cn.gov.cn.zxcny.cn http://www.morning.deanzhu.com.gov.cn.deanzhu.com http://www.morning.pbtdr.cn.gov.cn.pbtdr.cn http://www.morning.chbcj.cn.gov.cn.chbcj.cn http://www.morning.gjtdp.cn.gov.cn.gjtdp.cn http://www.morning.fpjw.cn.gov.cn.fpjw.cn http://www.morning.zlhzd.cn.gov.cn.zlhzd.cn http://www.morning.rxfgh.cn.gov.cn.rxfgh.cn http://www.morning.zknxh.cn.gov.cn.zknxh.cn http://www.morning.xbptx.cn.gov.cn.xbptx.cn http://www.morning.pfnrj.cn.gov.cn.pfnrj.cn http://www.morning.qcbhb.cn.gov.cn.qcbhb.cn http://www.morning.tnthd.cn.gov.cn.tnthd.cn http://www.morning.qkxt.cn.gov.cn.qkxt.cn