From 311243bbc5ffd962899787ef1b7221f23d9d394a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BF=9F=E6=B0=B8=E8=B6=85?= Date: Mon, 19 Dec 2016 00:02:58 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BD=BF=E7=94=A8Spring=20StateMachine?= =?UTF-8?q?=E6=A1=86=E6=9E=B6=E5=AE=9E=E7=8E=B0=E7=8A=B6=E6=80=81=E6=9C=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Chapter6-1-1/pom.xml | 46 +++++++++++ .../main/java/com/didispace/Application.java | 26 ++++++ .../main/java/com/didispace/EventConfig.java | 40 +++++++++ .../src/main/java/com/didispace/Events.java | 6 ++ .../com/didispace/StateMachineConfig.java | 82 +++++++++++++++++++ .../src/main/java/com/didispace/States.java | 7 ++ .../src/main/resources/application.properties | 2 + 7 files changed, 209 insertions(+) create mode 100644 Chapter6-1-1/pom.xml create mode 100644 Chapter6-1-1/src/main/java/com/didispace/Application.java create mode 100644 Chapter6-1-1/src/main/java/com/didispace/EventConfig.java create mode 100644 Chapter6-1-1/src/main/java/com/didispace/Events.java create mode 100644 Chapter6-1-1/src/main/java/com/didispace/StateMachineConfig.java create mode 100644 Chapter6-1-1/src/main/java/com/didispace/States.java create mode 100644 Chapter6-1-1/src/main/resources/application.properties diff --git a/Chapter6-1-1/pom.xml b/Chapter6-1-1/pom.xml new file mode 100644 index 0000000..ef3fd65 --- /dev/null +++ b/Chapter6-1-1/pom.xml @@ -0,0 +1,46 @@ + + + 4.0.0 + + com.didispace + statemachine + 0.0.1-SNAPSHOT + jar + + statemachine + Demo project for Spring Boot + + + org.springframework.boot + spring-boot-starter-parent + 1.4.2.RELEASE + + + + + UTF-8 + UTF-8 + 1.8 + + + + + org.springframework.boot + spring-boot-starter + + + org.springframework.statemachine + spring-statemachine-core + 1.2.0.RELEASE + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + diff --git a/Chapter6-1-1/src/main/java/com/didispace/Application.java b/Chapter6-1-1/src/main/java/com/didispace/Application.java new file mode 100644 index 0000000..34c59f4 --- /dev/null +++ b/Chapter6-1-1/src/main/java/com/didispace/Application.java @@ -0,0 +1,26 @@ +package com.didispace; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.CommandLineRunner; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.statemachine.StateMachine; + +@SpringBootApplication +public class Application implements CommandLineRunner { + + public static void main(String[] args) { + SpringApplication.run(Application.class, args); + } + + @Autowired + private StateMachine stateMachine; + + @Override + public void run(String... args) throws Exception { + stateMachine.start(); + stateMachine.sendEvent(Events.PAY); + stateMachine.sendEvent(Events.RECEIVE); + } + +} diff --git a/Chapter6-1-1/src/main/java/com/didispace/EventConfig.java b/Chapter6-1-1/src/main/java/com/didispace/EventConfig.java new file mode 100644 index 0000000..9ef447a --- /dev/null +++ b/Chapter6-1-1/src/main/java/com/didispace/EventConfig.java @@ -0,0 +1,40 @@ +package com.didispace; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.statemachine.annotation.*; + +/** + * 该配置实现了com.didispace.StateMachineConfig类中定义的状态机监听器实现。 + */ +@WithStateMachine +public class EventConfig { + + private Logger logger = LoggerFactory.getLogger(getClass()); + + @OnTransition(target = "UNPAID") + public void create() { + logger.info("订单创建,待支付"); + } + + @OnTransition(source = "UNPAID", target = "WAITING_FOR_RECEIVE") + public void pay() { + logger.info("用户完成支付,待收货"); + } + + @OnTransitionStart(source = "UNPAID", target = "WAITING_FOR_RECEIVE") + public void payStart() { + logger.info("用户完成支付,待收货: start"); + } + + @OnTransitionEnd(source = "UNPAID", target = "WAITING_FOR_RECEIVE") + public void payEnd() { + logger.info("用户完成支付,待收货: end"); + } + + @OnTransition(source = "WAITING_FOR_RECEIVE", target = "DONE") + public void receive() { + logger.info("用户已收货,订单完成"); + } + +} \ No newline at end of file diff --git a/Chapter6-1-1/src/main/java/com/didispace/Events.java b/Chapter6-1-1/src/main/java/com/didispace/Events.java new file mode 100644 index 0000000..3d67888 --- /dev/null +++ b/Chapter6-1-1/src/main/java/com/didispace/Events.java @@ -0,0 +1,6 @@ +package com.didispace; + +public enum Events { + PAY, // 支付 + RECEIVE // 收货 +} \ No newline at end of file diff --git a/Chapter6-1-1/src/main/java/com/didispace/StateMachineConfig.java b/Chapter6-1-1/src/main/java/com/didispace/StateMachineConfig.java new file mode 100644 index 0000000..919004c --- /dev/null +++ b/Chapter6-1-1/src/main/java/com/didispace/StateMachineConfig.java @@ -0,0 +1,82 @@ +package com.didispace; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.statemachine.config.EnableStateMachine; +import org.springframework.statemachine.config.EnumStateMachineConfigurerAdapter; +import org.springframework.statemachine.config.builders.StateMachineConfigurationConfigurer; +import org.springframework.statemachine.config.builders.StateMachineStateConfigurer; +import org.springframework.statemachine.config.builders.StateMachineTransitionConfigurer; +import org.springframework.statemachine.listener.StateMachineListener; +import org.springframework.statemachine.listener.StateMachineListenerAdapter; +import org.springframework.statemachine.transition.Transition; + +import java.util.EnumSet; + + +@Configuration +@EnableStateMachine +public class StateMachineConfig extends EnumStateMachineConfigurerAdapter { + + private Logger logger = LoggerFactory.getLogger(getClass()); + + @Override + public void configure(StateMachineStateConfigurer states) + throws Exception { + states + .withStates() + .initial(States.UNPAID) + .states(EnumSet.allOf(States.class)); + } + + @Override + public void configure(StateMachineTransitionConfigurer transitions) + throws Exception { + transitions + .withExternal() + .source(States.UNPAID).target(States.WAITING_FOR_RECEIVE) + .event(Events.PAY) + .and() + .withExternal() + .source(States.WAITING_FOR_RECEIVE).target(States.DONE) + .event(Events.RECEIVE); + } + +// @Override +// public void configure(StateMachineConfigurationConfigurer config) +// throws Exception { +// config +// .withConfiguration() +// .listener(listener()); +// } +// +// @Bean +// public StateMachineListener listener() { +// return new StateMachineListenerAdapter() { +// +// @Override +// public void transition(Transition transition) { +// if(transition.getTarget().getId() == States.UNPAID) { +// logger.info("订单创建,待支付"); +// return; +// } +// +// if(transition.getSource().getId() == States.UNPAID +// && transition.getTarget().getId() == States.WAITING_FOR_RECEIVE) { +// logger.info("用户完成支付,待收货"); +// return; +// } +// +// if(transition.getSource().getId() == States.WAITING_FOR_RECEIVE +// && transition.getTarget().getId() == States.DONE) { +// logger.info("用户已收货,订单完成"); +// return; +// } +// } +// +// }; +// } + +} diff --git a/Chapter6-1-1/src/main/java/com/didispace/States.java b/Chapter6-1-1/src/main/java/com/didispace/States.java new file mode 100644 index 0000000..4adbb0e --- /dev/null +++ b/Chapter6-1-1/src/main/java/com/didispace/States.java @@ -0,0 +1,7 @@ +package com.didispace; + +public enum States { + UNPAID, // 待支付 + WAITING_FOR_RECEIVE, // 待收货 + DONE // 结束 +} diff --git a/Chapter6-1-1/src/main/resources/application.properties b/Chapter6-1-1/src/main/resources/application.properties new file mode 100644 index 0000000..a60671a --- /dev/null +++ b/Chapter6-1-1/src/main/resources/application.properties @@ -0,0 +1,2 @@ +spring.application.name=statemachine +