开始

如果您刚刚开始使用 Spring Statemachine, 这是为您准备的部分!在这里,我们回答了基本的 “”、“” 和 “” 问题。我们从温和的 Spring Statemachine 简介。然后,我们构建 第一个 Spring Statemachine 应用程序并讨论一些 核心原则。what?how?why?

系统要求

Spring Statemachine 4.0.0 是使用 JDK 8(所有工件都与 JDK 7 兼容)和 Spring 框架 6.0.14.它不需要任何其他 Spring Framework 之外的依赖项。spring-doc.cn

其他可选部分(例如使用分布式状态)依赖于 Zookeeper,而状态机示例具有依赖项 on 和 ,它们拉取其他依赖项 超越框架本身。此外,可选的安全和数据访问功能具有 对 Spring Security 和 Spring Data 模块的依赖关系。spring-shellspring-bootspring-doc.cn

模块

下表描述了可用于 Spring Statemachine 的模块。spring-doc.cn

模块 描述

spring-statemachine-corespring-doc.cn

Spring Statemachine 的核心系统。spring-doc.cn

spring-statemachine-recipes-commonspring-doc.cn

不需要核心之外依赖项的常见配方 框架。spring-doc.cn

spring-statemachine-kryospring-doc.cn

KryoSpring Statemachine 的序列化器。spring-doc.cn

spring-statemachine-data-commonspring-doc.cn

的通用支持模块 。Spring Dataspring-doc.cn

spring-statemachine-data-jpaspring-doc.cn

的支持模块 。Spring Data JPAspring-doc.cn

spring-statemachine-data-redisspring-doc.cn

的支持模块 。Spring Data Redisspring-doc.cn

spring-statemachine-data-mongodbspring-doc.cn

的支持模块 。Spring Data MongoDBspring-doc.cn

spring-statemachine-zookeeperspring-doc.cn

分布式状态机的 Zookeeper 集成。spring-doc.cn

spring-statemachine-testspring-doc.cn

用于状态机测试的支持模块。spring-doc.cn

spring-statemachine-clusterspring-doc.cn

Spring Cloud Cluster 的支持模块。 请注意,Spring Cloud Cluster 已被 Spring Integration 取代。spring-doc.cn

spring-statemachine-umlspring-doc.cn

使用 Eclipse Papyrus 进行 UI UML 建模的支持模块。spring-doc.cn

spring-statemachine-autoconfigurespring-doc.cn

Spring Boot 的支持模块。spring-doc.cn

spring-statemachine-bomspring-doc.cn

物料清单 pom.spring-doc.cn

spring-statemachine-starterspring-doc.cn

Spring Boot Starters。spring-doc.cn

使用 Gradle

下面的清单显示了通过在 https://start.spring.io 中选择各种设置创建的典型文件:build.gradlespring-doc.cn

buildscript {
	ext {
		springBootVersion = '3.1.6'
	}
	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'
sourceCompatibility = 1.8

repositories {
	mavenCentral()
	maven { url "https://repo.spring.io/snapshot" }
	maven { url "https://repo.spring.io/milestone" }
}


ext {
	springStatemachineVersion = '4.0.0'
}

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-SNAPSHOT

使用正常的项目结构,您可以使用以下命令构建此项目:spring-doc.cn

# ./gradlew clean build

预期的 Spring Boot 打包的胖 jar 将是 。build/libs/demo-0.0.1-SNAPSHOT.jarspring-doc.cn

您不需要 'libs-milestone' 和存储库 生产开发。libs-snapshot

使用 Maven

以下示例显示了一个典型文件,该文件是通过在 https://start.spring.io 处选择各种选项创建的:pom.xmlspring-doc.cn

<?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.1.6</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.0</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-SNAPSHOT

使用正常的项目结构,您可以使用以下命令构建此项目:spring-doc.cn

# mvn clean package

预期的 Spring Boot 打包的 fat-jar 将是 .target/demo-0.0.1-SNAPSHOT.jarspring-doc.cn

您不需要 和 repositories 生产开发。libs-milestonelibs-snapshot

开发您的第一个 Spring Statemachine 应用程序

您可以从创建一个简单的 Spring Boot 类开始 实现 .以下示例显示了如何执行此操作:ApplicationCommandLineRunnerspring-doc.cn

@SpringBootApplication
public class Application implements CommandLineRunner {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

}

然后,您需要添加状态和事件,如下例所示:spring-doc.cn

public enum States {
    SI, S1, S2
}

public enum Events {
    E1, E2
}

然后你需要添加状态机配置,如下例所示:spring-doc.cn

@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());
            }
        };
    }
}

然后,您需要 implement 和 autowire 。 以下示例显示了如何执行此操作:CommandLineRunnerStateMachinespring-doc.cn

@Autowired
private StateMachine<States, Events> stateMachine;

@Override
public void run(String... args) throws Exception {
    stateMachine.sendEvent(Events.E1);
    stateMachine.sendEvent(Events.E2);
}

根据您是使用 还是 构建应用程序 , 您可以分别使用 或 来运行它。GradleMavenjava -jar build/libs/gs-statemachine-0.1.0.jarjava -jar target/gs-statemachine-0.1.0.jarspring-doc.cn

此命令的结果应该是正常的 Spring Boot 输出。 但是,您还应该找到以下几行:spring-doc.cn

State change to SI
State change to S1
State change to S2

这些线条表示您构建的机器 正在从一个状态移动到另一个状态,这是它应该做的。spring-doc.cn