背景介绍
本系列通过学习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
Spring StateMachine与数据库状态同步

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

被折叠的 条评论
为什么被折叠?



