一、状态机
有限状态机是一种用来进行对象行为建模的工具,其作用主要是描述对象在它的生命周期内所经历的状态序列,以及如何响应来自外界的各种事件。在电商场景(订单、物流、售后)、社交(IM消息投递)、分布式集群管理(分布式计算平台任务编排)等场景都有大规模的使用。
状态机的要素:
状态机可归纳为4个要素,现态、条件、动作、次态。“现态”和“条件”是因,“动作”和“次态”是果。
1 现态:指当前所处的状态
2 条件:又称“事件”,当一个条件被满足,将会触发一个动作,或者执行一次状态的迁移
3 动作:条件满足后执行的动作。动作执行完毕后,可以迁移到新的状态,也可以仍旧保持原状态。动作不是必须的,当条件满足后,也可以不执行任何动作,直接迁移到新的状态。
4 次态:条件满足后要迁往的新状态。“次态”是相对于“现态”而言的,“次态”一旦被激活,就转换成“现态”。
状态机动作类型:
进入动作:在进入状态时进行
退出动作:在退出状态时进行
输入动作:依赖于当前状态和输入条件进行
转移动作:在进行特定转移时进行
二、spring statemachine
spring statemachine是使用 Spring框架下的状态机概念创建的一种应用程序开发框架。它使得状态机结构层次化,简化了配置状态机的过程。
官方文档:https://docs.spring.io/autorepo/docs/spring-statemachine/1.0.0.M3/reference/htmlsingle/#sm-stateconte
例子一:简单订单流程
使用过程:
1 引入依赖
2 创建订单状态枚举类和状态转换枚举类
3 添加配置
4 添加订单状态监听器
5 service中使用
6 测试
例子二:状态机工厂
有些时候,一个状态机不够用,因为我们可能要处理多个订单。这个时候就要用到了状态机工厂。
1 配置修改
2 service中使用
<span class="hljs-annotation">@Service(<span class="hljs-string">"orderService")
<span class="hljs-keyword">public <span class="hljs-class"><span class="hljs-keyword"><span class="hljs-keyword">class <span class="hljs-title"><span class="hljs-title">OrderServiceImpl <span class="hljs-keyword"><span class="hljs-title">implements <span class="hljs-title"><span class="hljs-title">OrderService {
<span class="hljs-annotation">@Autowired
<span class="hljs-keyword">private OrderMapper orderMapper;
</span></span></span></span></span></span></span></span></span></span></span></span></span></span>
3 listener中配置id
@Component(<span class="hljs-string">"orderStateListener")
@WithStateMachine(id = OrderStateMachineConfig<span class="hljs-preprocessor">.orderStateMachineId)
<span class="hljs-keyword">public <span class="hljs-keyword">class <span class="hljs-title">OrderStateListenerImpl {
@OnTransition(source = <span class="hljs-string">"WAIT_PAYMENT", target = <span class="hljs-string">"WAIT_DELIVER")
<span class="hljs-function"><span class="hljs-keyword">public boolean <span class="hljs-title">payTransition(<span class="hljs-params">Message<orderstatuschangeevent> message) {
System<span class="hljs-preprocessor">.<span class="hljs-keyword">out<span class="hljs-preprocessor">.println(<span class="hljs-string">"----------------------------")</span></span></span></span></orderstatuschangeevent></span></span></span></span></span></span></span></span></span></span></span>
转自 https://www.codetd.com/article/1010726
Original: https://www.cnblogs.com/xd502djj/p/15906917.html
Author: 茄子_2008
Title: Spring StateMachine状态机
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/540791/
转载文章受原作者版权保护。转载请注明原作者出处!