开始

如果你刚开始使用Spring Statemachine, 这正是为你准备的部分!这里,我们回答基本问题 “什么?”, “如何?“和”为什么?“问题。我们从温柔的开始 Spring Statemachine 简介。然后我们会构建 第一个Spring状态机应用并讨论了一些内容 核心原则,我们一路走来。

3. 系统需求

Spring Statemachine 4.0.2-SNAPSHOT 构建并测试为 JDK 8(所有工件均兼容JDK 7)和Spring 框架 6.2.10。它不需要其他任何东西 Spring Framework 核心系统内的依赖。spring-doc.cadn.net.cn

其他可选部分(如使用分布式状态)依赖于 Zookeeper,而State Machine Examples则有依赖关系 上Spring靴,拉取其他依赖关系 超越了框架本身。此外,可选的安全和数据访问功能 依赖于 Spring Security 和 Spring Data 模块。spring-doc.cadn.net.cn

4. 模

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

模块 描述

Spring-statemachine-corespring-doc.cadn.net.cn

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

spring-statemachine-recipes-commonspring-doc.cadn.net.cn

常见的配方,不需要核心以外的依赖 框架。spring-doc.cadn.net.cn

Spring-statemachine-kryospring-doc.cadn.net.cn

克里奥Spring Statemachine 的串行化器。spring-doc.cadn.net.cn

Spring-statemachine-data-commonspring-doc.cadn.net.cn

通用支持模块春季数据.spring-doc.cadn.net.cn

Spring-statemachine-data-jpaspring-doc.cadn.net.cn

支持模块春季数据 JPA.spring-doc.cadn.net.cn

Spring-statemachine-data-redisspring-doc.cadn.net.cn

支持模块春季数据 Redis.spring-doc.cadn.net.cn

Spring-statemachine-data-mongodbspring-doc.cadn.net.cn

支持模块春季数据 MongoDB.spring-doc.cadn.net.cn

Spring-状态机-动物管理员spring-doc.cadn.net.cn

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

spring-statemachine-test(Spring状态机测试)spring-doc.cadn.net.cn

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

spring-statemachine-clusterspring-doc.cadn.net.cn

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

Spring-statemachine-umlspring-doc.cadn.net.cn

支持Eclipse Papyrus的UI建模模块。spring-doc.cadn.net.cn

Spring-statemachine-autoconfigurespring-doc.cadn.net.cn

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

Spring-状态机-BOMspring-doc.cadn.net.cn

物料清单 砰。spring-doc.cadn.net.cn

Spring-statemachine-starterspring-doc.cadn.net.cn

Spring靴Starters。spring-doc.cadn.net.cn

5. 使用 Gradle

以下列表展示了典型情况build.gradle通过在 https://start.spring.io 选择各种设置创建的文件:spring-doc.cadn.net.cn

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-快照用你想用的版本。

在正常的项目结构中,您可以使用以下命令构建该项目:spring-doc.cadn.net.cn

# ./gradlew clean build

预期的Spring Boot包装大罐会是构建/图书馆/开demo-0.0.1-SNAPSHOT.jar.spring-doc.cadn.net.cn

你不需要“libs里程碑”,而且libs快照的仓库 制作开发。

6. 使用 Maven

以下示例展示了一个典型的pom.xml该文件通过在 https://start.spring.io 选择多个选项创建:spring-doc.cadn.net.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.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-快照用你想用的版本。

在正常的项目结构中,您可以使用以下命令构建该项目:spring-doc.cadn.net.cn

# mvn clean package

预期的Spring Boot包装大罐会是目标/demo-0.0.1-SNAPSHOT.jar.spring-doc.cadn.net.cn

你不需要自由党里程碑libs快照的仓库 制作开发。

7. 开发你的第一个春季状态机应用

你可以先创建一个简单的Spring靴应用类 实现命令线跑者.以下示例展示了如何实现:spring-doc.cadn.net.cn

@SpringBootApplication
public class Application implements CommandLineRunner {

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

}

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

public enum States {
    SI, S1, S2
}

public enum Events {
    E1, E2
}

然后你需要添加状态机配置,如下示例所示:spring-doc.cadn.net.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());
            }
        };
    }
}

然后你需要实现命令线跑者以及自动线缆状态机. 以下示例展示了如何实现:spring-doc.cadn.net.cn

@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.jarJava -jar target/gs-statemachine-0.1.0.jar分别。spring-doc.cadn.net.cn

该命令的结果应是正常的Spring Boot输出。 不过,你还应该能找到以下几条线:spring-doc.cadn.net.cn

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

这些线条表示你建造的机器 正在从一个状态移动到另一个状态,正如它应该的那样。spring-doc.cadn.net.cn