开始
什么?”, “如何?“和”为什么?“问题。我们从温柔的开始
Spring Statemachine 简介。然后我们会构建
第一个Spring状态机应用并讨论了一些内容
核心原则,我们一路走来。3. 系统需求
Spring Statemachine 4.0.2-SNAPSHOT 构建并测试为 JDK 8(所有工件均兼容JDK 7)和Spring 框架 6.2.10。它不需要其他任何东西 Spring Framework 核心系统内的依赖。
其他可选部分(如使用分布式状态)依赖于
Zookeeper,而State Machine Examples则有依赖关系
上Spring靴,拉取其他依赖关系
超越了框架本身。此外,可选的安全和数据访问功能
依赖于 Spring Security 和 Spring Data 模块。
4. 模
下表描述了 Spring Statemachine 可用的模块。
| 模块 | 描述 |
|---|---|
|
Spring Statemachine 的核心系统。 |
|
常见的配方,不需要核心以外的依赖 框架。 |
|
|
|
通用支持模块 |
|
支持模块 |
|
支持模块 |
|
支持模块 |
|
分布式状态机的Zookeeper集成。 |
|
用于状态机测试的支持模块。 |
|
Spring Cloud 集群的支持模块。 注意,Spring Cloud Cluster 已被 Spring Integration 取代。 |
|
支持Eclipse Papyrus的UI建模模块。 |
|
Spring Boot 的支持模块。 |
|
物料清单 砰。 |
|
Spring靴Starters。 |
5. 使用 Gradle
以下列表展示了典型情况build.gradle通过在 https://start.spring.io 选择各种设置创建的文件:
buildscript {
ext {
springBootVersion = '3.5.6-SNAPSHOT'
}
repositories {
mavenCentral()
maven { url "https://repo.spring.io/snapshot" }
maven { url "https://repo.spring.io/milestone" }
}
dependencies {
classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
}
}
apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'org.springframework.boot'
apply plugin: 'io.spring.dependency-management'
group = 'com.example'
version = '0.0.1-SNAPSHOT'
java {
sourceCompatibility = JavaVersion.VERSION_1_8
}
repositories {
mavenCentral()
maven { url "https://repo.spring.io/snapshot" }
maven { url "https://repo.spring.io/milestone" }
}
ext {
springStatemachineVersion = '4.0.2-SNAPSHOT'
}
dependencies {
compile('org.springframework.statemachine:spring-statemachine-starter')
testCompile('org.springframework.boot:spring-boot-starter-test')
}
dependencyManagement {
imports {
mavenBom "org.springframework.statemachine:spring-statemachine-bom:${springStatemachineVersion}"
}
}
取代0.0.1-快照用你想用的版本。 |
在正常的项目结构中,您可以使用以下命令构建该项目:
# ./gradlew clean build
预期的Spring Boot包装大罐会是构建/图书馆/开demo-0.0.1-SNAPSHOT.jar.
你不需要“libs里程碑”,而且libs快照的仓库
制作开发。 |
6. 使用 Maven
以下示例展示了一个典型的pom.xml该文件通过在 https://start.spring.io 选择多个选项创建:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>gs-statemachine</name>
<description>Demo project for Spring Statemachine</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.5.6-SNAPSHOT</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<spring-statemachine.version>4.0.2-SNAPSHOT</spring-statemachine.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.statemachine</groupId>
<artifactId>spring-statemachine-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.statemachine</groupId>
<artifactId>spring-statemachine-bom</artifactId>
<version>${spring-statemachine.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
<repositories>
<repository>
<id>spring-snapshots</id>
<name>Spring Snapshots</name>
<url>https://repo.spring.io/snapshot</url>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
<repository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/milestone</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>spring-snapshots</id>
<name>Spring Snapshots</name>
<url>https://repo.spring.io/snapshot</url>
<snapshots>
<enabled>true</enabled>
</snapshots>
</pluginRepository>
<pluginRepository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/milestone</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</pluginRepository>
</pluginRepositories>
</project>
取代0.0.1-快照用你想用的版本。 |
在正常的项目结构中,您可以使用以下命令构建该项目:
# mvn clean package
预期的Spring Boot包装大罐会是目标/demo-0.0.1-SNAPSHOT.jar.
你不需要自由党里程碑和libs快照的仓库
制作开发。 |
7. 开发你的第一个春季状态机应用
你可以先创建一个简单的Spring靴应用类
实现命令线跑者.以下示例展示了如何实现:
@SpringBootApplication
public class Application implements CommandLineRunner {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
然后你需要添加状态和事件,如下示例所示:
public enum States {
SI, S1, S2
}
public enum Events {
E1, E2
}
然后你需要添加状态机配置,如下示例所示:
@Configuration
@EnableStateMachine
public class StateMachineConfig
extends EnumStateMachineConfigurerAdapter<States, Events> {
@Override
public void configure(StateMachineConfigurationConfigurer<States, Events> config)
throws Exception {
config
.withConfiguration()
.autoStartup(true)
.listener(listener());
}
@Override
public void configure(StateMachineStateConfigurer<States, Events> states)
throws Exception {
states
.withStates()
.initial(States.SI)
.states(EnumSet.allOf(States.class));
}
@Override
public void configure(StateMachineTransitionConfigurer<States, Events> transitions)
throws Exception {
transitions
.withExternal()
.source(States.SI).target(States.S1).event(Events.E1)
.and()
.withExternal()
.source(States.S1).target(States.S2).event(Events.E2);
}
@Bean
public StateMachineListener<States, Events> listener() {
return new StateMachineListenerAdapter<States, Events>() {
@Override
public void stateChanged(State<States, Events> from, State<States, Events> to) {
System.out.println("State change to " + to.getId());
}
};
}
}
然后你需要实现命令线跑者以及自动线缆状态机.
以下示例展示了如何实现:
@Autowired
private StateMachine<States, Events> stateMachine;
@Override
public void run(String... args) throws Exception {
stateMachine.sendEvent(Events.E1);
stateMachine.sendEvent(Events.E2);
}
这取决于你是否构建了应用格拉德勒或梅文,
你可以用以下方式运行它Java -jar build/libs/gs-statemachine-0.1.0.jar或Java -jar target/gs-statemachine-0.1.0.jar分别。
该命令的结果应是正常的Spring Boot输出。 不过,你还应该能找到以下几条线:
State change to SI
State change to S1
State change to S2
这些线条表示你建造的机器 正在从一个状态移动到另一个状态,正如它应该的那样。