Spring系列學習之Spring Statemachine狀態機
阿新 • • 發佈:2018-12-23
英文原文:https://projects.spring.io/spring-statemachine/
目錄
Spring Statemachine是應用程式開發人員在Spring應用程式中使用狀態機概念的框架。
Spring Statemachine旨在提供以下功能:
- 易於使用的扁平單級狀態機,用於簡單的使用案例。
- 分層狀態機結構,以簡化複雜的狀態配置。
- 狀態機區域提供更復雜的狀態配置。
- 使用觸發器,轉換,警衛和操作。
- 鍵入安全配置介面卡。
- 生成器模式,用於在Spring Application上下文之外使用的簡單例項化
- 通常用例的食譜
- 基於Zookeeper的分散式狀態機
- 狀態機事件監聽器。
- UML Eclipse Papyrus建模。
- 將計算機配置儲存在永久儲存中。
- Spring IOC整合將bean與狀態機關聯起來。
狀態機功能強大,因為行為始終保證一致,使除錯相對容易。這是因為操作規則是在機器啟動時寫成的。這個想法是你的應用程式可能存在於有限數量的狀態中,某些預定義的觸發器可以將你的應用程式從一個狀態轉移到另一個狀態。此類觸發器可以基於事件或計時器。
在應用程式之外定義高階邏輯然後依靠狀態機來管理狀態要容易得多。您可以通過傳送事件,偵聽更改或僅請求當前狀態來與狀態機進行互動。
你想問一個問題嗎?轉到StackOverflow
快速開始
在專案中使用spring-statemachine的推薦方法是使用依賴關係管理系統 - 下面的程式碼片段可以複製並貼上到您的構建中。 需要幫忙? 請參閱我們的Maven和Gradle構建入門指南。(導航到英文頁面可以選擇版本和依賴方式)
Maven
<dependencies>
<dependency>
<groupId>org.springframework.statemachine</groupId>
<artifactId>spring-statemachine-core</artifactId>
<version>2.0.3.RELEASE</version>
</dependency>
</dependencies>
Gradle
dependencies {
compile 'org.springframework.statemachine:spring-statemachine-core:2.0.3.RELEASE'
}
以下示例應該瞭解如何配置和使用狀態機。 假設我們有狀態STATE1,STATE2和事件EVENT1,EVENT2。
static enum States {
STATE1, STATE2
}
static enum Events {
EVENT1, EVENT2
}
Builder
public StateMachine<States, Events> buildMachine() throws Exception {
Builder<States, Events> builder = StateMachineBuilder.builder();
builder.configureStates()
.withStates()
.initial(States.STATE1)
.states(EnumSet.allOf(States.class));
builder.configureTransitions()
.withExternal()
.source(States.STATE1).target(States.STATE2)
.event(Events.EVENT1)
.and()
.withExternal()
.source(States.STATE2).target(States.STATE1)
.event(Events.EVENT2);
return builder.build();
}
StateMachine<States, Events> stateMachine = buildMachine();
stateMachine.start();
stateMachine.sendEvent(Events.EVENT1);
stateMachine.sendEvent(Events.EVENT2);
JavaConfig
@Configuration
@EnableStateMachine
static class Config1 extends EnumStateMachineConfigurerAdapter<States, Events> {
@Override
public void configure(StateMachineStateConfigurer<States, Events> states)
throws Exception {
states
.withStates()
.initial(States.STATE1)
.states(EnumSet.allOf(States.class));
}
@Override
public void configure(StateMachineTransitionConfigurer<States, Events> transitions)
throws Exception {
transitions
.withExternal()
.source(States.STATE1).target(States.STATE2)
.event(Events.EVENT1)
.and()
.withExternal()
.source(States.STATE2).target(States.STATE1)
.event(Events.EVENT2);
}
}
@WithStateMachine
static class MyBean {
@OnTransition(target = "STATE1")
void toState1() {
}
@OnTransition(target = "STATE2")
void toState2() {
}
}
static class MyApp {
@Autowired
StateMachine<States, Events> stateMachine;
void doSignals() {
stateMachine.start();
stateMachine.sendEvent(Events.EVENT1);
stateMachine.sendEvent(Events.EVENT2);
}
}
版本
Spring Statemachine
Release
Documentation
2.1.0 M1
2.1.0
2.0.4
2.0.3
1.2.13
1.2.12
1.1.1
資源
https://github.com/spring-projects/spring-statemachine/tree/master/spring-statemachine-samples