通过实例学习SpringStateMachine之Persist

本文通过示例讲解如何使用Spring StateMachine控制数据库记录的状态变化,重点介绍PersistStateMachineHandler和PersistStateChangeListener的作用。

背景介绍

本系列通过学习SpringStateMachine中附带的10余个Sample来学习SpringStateMachine中的各个概念和用法。项目是使用的分支为2.2.0.RELEASE。项目参考文档也是2.2.0.RELEASE。

Persist简介

Persist这个例子演示了通过状态机来更新数据库中记录的状态。例如一条订单记录,有两个状态,支付与未支付。建立对应的订单状态机,当状态机状态变化后,数据库中的订单记录状态同时发生更新。

本例中描述的数据库记录的状态机如下图所示:
在这里插入图片描述

一共有4个状态PLACED、PROCESSING、SENT、DELIVERED。当触发相应事件后对应的状态发生变化。数据库中对应的这条记录的状态同时发生变化。

Persist 依赖

项目在实现上述功能时,需要依赖springshell,官方给出的demo[1]使用了spring-shell1.2,本文将其改为spring-shell 2.0.0.RELEASE。由于Persist需要操作数据库及处理数据库状态事件,因此我的这个例子中使用mysql。最终会依赖spring-boot-starter-jdbc,mysql-connector-java及spring-statemachine-recipes-common。

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

        <dependency>
            <groupId>org.springframework.shell</groupId>
            <artifactId>spring-shell-starter</artifactId>
            <version>2.0.0.RELEASE</version>
        </dependency>
        
       <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>
        
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
        
        <dependency>
            <groupId>org.springframework.statemachine</groupId>
            <artifactId>spring-statemachine-recipes-common</artifactId>
            <version>2.2.0.RELEASE</version>
        </dependency>

Persist实现

首先我们创建一个Order对象,state共有4中状态,分别是Persist简介中状态机对应的四种状态。

public static class Order {
   
   
	int id;
	String state;

	public Order(int id, String state) {
   
   
		this.id = id;
		this.state = state;
	}

	@Override
	public String toString() {
   
   
		return "Order [id=" + id + ", state=" + state + "]";
	}
}

接着创建mysql数据表orders。

CREATE TABLE `orders` (
  `id` int(11) NOT NULL,
  `state` varchar(20) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

配置数据库。

##数据库配置
##数据库地址
spring.datasource.url=jdbc:mysql://localhost:3306/test?characterEncoding=utf8&useSSL=false
##数据库用户名
spring.datasource.username=root
##数据库密码
spring.datasource.password=root
##数据库驱动
spring.datasource.driver-class-name=com.mysql.jdbc.Driver

根据状态机图配置状态机。注意这里和前几节的差异是使用了字符串来描述状态,而不是枚举类型。

import org.springframework.context.annotation
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值