Spring发布1.1版Statemachine框架

2016 年 6 月 11 日

Spring 最近发布了名为 Statemachine 的 1.1 版状态机(State machine)框架,该版本新增了如下功能:

  • 支持 Spring Security
  • 可与 @WithStateMachine 实现更进一步的集成
  • 内建对 Redis 的支持
  • 支持 UI 建模

根据 Spring Statemachine 官网介绍,Spring Statemachine“是一种供应用程序开发者在 Spring 应用程序中使用状态机概念的框架。”Statemachine 包含所有常用的核心 Spring 框架,例如通过 Spring 的 Inversion of Control 将 Bean 关联至有限状态机(Finite State Machine,FSM)的能力。

如果应用程序的状态数量是固定的,并且事件会按照顺序依次在不同状态之间转换,此时为应用程序部署 FSM 将能带来巨大的价值。Statemachine 会使用基于事件或计时器的触发器进行此类转换。

状态和事件可通过 String 和 Enumeration 这两种数据类型实现。

例如,我们要开发一个下列状态示意图所示的验票闸机:

在这个闸机的 FSM 中,有 LOCKED 和 UNLOCKED 两种状态,InsertToken 和 PassThru 两种事件,以及 Unlock、Lock、Alarm 和 Refund 四种操作。初始状态 LOCKED 是由示意图中该状态内部的同心圆代表的。发起 InsertToken 事件将触发一个 Unlock 操作,并将状态由 LOCKED 变为 UNLOCKED。一旦处于 UNLOCKED 状态,将发起 PassThru 事件并触发 Lock 操作,随后闸机状态将重新变为 LOCKED。Alarm 和 Refund 这两个操作不会导致状态的变化。

为确保这个演示应用尽量简单,其中并未定义具体操作。状态和事件可通过 Enumeration 实现:

复制代码
static enum States {
LOCKED,
UNLOCKED
}
复制代码
static enum Events {
INSERTTOKEN,
PASSTHRU
}

随后需要在 StateMachineConfigurer 接口中通过定义 Spring @Configuration 注解上下文(Annotation context)的方式配置状态和转换:

复制代码
@Configuration
@EnableStateMachine
static class Config extends EnumStateMachineConfigurerAdapter<states> {
@Override
public void configure(StateMachineStateConfigurer<states> states)
throws Exception {
states
.withStates()
.initial(States.LOCKED)
.states(EnumSet.allOf(States.class));
}
@Override
public void configure(StateMachineTransitionConfigurer<states> transitions)
throws Exception {
transitions
.withExternal()
.source(States.LOCKED)
.target(States.UNLOCKED)
.event(Events.InsertToken)
.and()
.withExternal()
.source(States.UNLOCKED)
.target(States.LOCKED)
.event(Events.PassThru);
}
}</states></states></states>

@EnableStateMachine 注解信号可以通知该上下文闸机可立刻构建完成并启动。

在上述配置中,初始状态 LOCKED 是通过 states.withStates().initial(States.LOCKED) 语句定义的。转换则是使用上述代码中所示的 source()、target(),以及 event() 方法定义的。这一系列方法可以用于在 FSM 中定义所有状态转换。更改状态的标准方法是 withExternal()。如果某个操作无需更改状态,例如上述示意图中的 Alarm 和 Refund 操作,则可使用 withInternal() 方法定义。

此外可通过定义 StateMachineListener 监控闸机 FSM 的过程:

复制代码
static class StateMachineListener extends StateMachineListenerAdapter<states> {
@Override
public void stateChanged(State<states> from,State<states> to) {
System.out.println("State changed to: " + to.getId());
}
}</states></states></states>

最后可以创建一个 StateMachine 实例并定义一个 run() 方法实现监听器,启动闸机 FSM,并发送事件。

复制代码
@Autowired
StateMachine<states> stateMachine;
@Override
public void run(String... args) throws Exception {
StateMachineListener listener = new StateMachineListener();
stateMachine.addStateListener(listener);
stateMachine.start();
stateMachine.sendEvent(Events.InsertToken);
stateMachine.sendEvent(Events.PassThru);
}
public static void main(String[] args) {
SpringApplication.run(org.redlich.statemachine.DemoApplication.class,args);
}</states>

整个项目已发布至 Github 。详细的参考指南可访问 Spring Statemachine 网站

查看英文原文: Spring Releases Version 1.1 Statemachine Framework

2016 年 6 月 11 日 19:002530
用户头像

发布了 283 篇内容, 共 84.3 次阅读, 收获喜欢 34 次。

关注

评论

发布
暂无评论
发现更多内容

想退休,可能没机会了

池建强

读书感悟

CDN云课堂 |可编程CDN – EdgeScript应用场景、语言速览和实操演示

巨侠说

用SpreadJS实现在线Excel的录入与展示,提升企业医保信息化服务水平

Geek_Willie

SpreadJS 医保信息化 在线excel

原创 | 使用JUnit、AssertJ和Mockito编写单元测试和实践TDD (五)第一个单元测试

编程道与术

Java 编程 软件测试 TDD 单元测试

一文看懂开源工作流引擎 Flowable

Herbert

Java spring 开源 企业中台 工作流

CDN云课堂 | EdgeRoutine技术专家教你把JS代码跑到CDN边缘

巨侠说

Java CDN edge

原创 | 使用JUnit、AssertJ和Mockito编写单元测试和实践TDD (四)关于单元测试的常见错误观念和做法

编程道与术

Java 编程 软件测试 TDD 单元测试

工作两年简历写成这样,谁要你呀!

小傅哥

面试 小傅哥 Java 面试 简历优化 找工作

TOTO 2020再次荣获iF、红点两项国际设计大奖

极客编

聊聊Serverless

kimmking

使用jdbcSstoragerHandler 处理mysql、oracle 、hive数据

杨飞

智浪

Neil

后浪 智能时代 智浪

我站在愚蠢之巅

escray

学习 CSD 认证实战营

由丰巢快递柜引发的思考

Neco.W

创业 思考 丰巢

谈谈控制感(2):怎么让我们更健康

史方远

个人成长 心理

Java 编程基础

michaelliu

延时任务的几种实现方式

郭儿的跋涉

Java 延时任务 延时消息

我常用的在线工具清单

彭宏豪95

效率 效率工具 工具

GrowingIO 微服务 SaaS 与私有部署运行实践

GrowingIO技术专栏

大数据 微服务架构 SaaS

KubeFATE:在Kubernetes上部署联邦学习平台

亨利笔记

人工智能 学习 FATE KUBEFATE

视达荣登ChinaBang Awards 2020智慧零售榜Top10

极客编

《Linux就该这么学》笔记(二)

编程随想曲

Linux

CDN百科 | 最近,你的APP崩了吗?

巨侠说

CDN

CDN百科 | 假如没有CDN,网络世界会变成什么样?

巨侠说

通过一个聊天应用学习 Deno

寇云

typescript 后端

如何推动与影响中型前端团队的成长

堂主

前端 研发管理 团队建设

多个 SSH keys 的配置,方便 Git 对不同仓库的使用与管理

与光

git GitHub SSH

DD 测试linux性能

HU

MySQL数据类型DECIMAL用法

Simon

MySQL

可视化 Tekton 组件 Tekton Dashboard

郭旭东

Kubernetes cicd

交易上链——中心化数字资产交易所的完美解决之道

MaxHu

区块链 智能合约 数字货币 去中心化网络 数字资产

Spring发布1.1版Statemachine框架-InfoQ