Skip to content

Commit

Permalink
fsm bug modify
Browse files Browse the repository at this point in the history
  • Loading branch information
AllenDEricDAlexander committed Dec 1, 2023
1 parent ec1ee55 commit 5f4dd40
Show file tree
Hide file tree
Showing 11 changed files with 181 additions and 339 deletions.
23 changes: 22 additions & 1 deletion fsm/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -17,12 +17,33 @@
<java.version>17</java.version>
</properties>

<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.statemachine</groupId>
<artifactId>spring-statemachine-bom</artifactId>
<version>2.1.3.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>

<dependencies>
<dependency>
<groupId>org.springframework.statemachine</groupId>
<artifactId>spring-statemachine-starter</artifactId>
<version>3.2.1</version>
</dependency>
<dependency>
<groupId>org.springframework.statemachine</groupId>
<artifactId>spring-statemachine-recipes-common</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>

<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
package top.atluofu.fsm.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.statemachine.config.EnableStateMachineFactory;
import org.springframework.statemachine.config.StateMachineConfigurerAdapter;
import org.springframework.statemachine.config.builders.StateMachineStateConfigurer;
import org.springframework.statemachine.config.builders.StateMachineTransitionConfigurer;
import top.atluofu.fsm.model.Events;
import top.atluofu.fsm.model.States;

/**
* @ClassName: OrderStateMachineFactoryConfig
* @description: OrderStateMachineFactoryConfig
* @author: 有罗敷的马同学
* @datetime: 2023Year-12Month-01Day-8:36
* @Version: 1.0
*/
@Configuration
@EnableStateMachineFactory(name = "orderStateMachineFactory")
public class OrderStateMachineFactoryConfig extends StateMachineConfigurerAdapter<String, String> {
@Override
public void configure(StateMachineStateConfigurer<String, String> states)
throws Exception {
states.withStates()
.initial(States.ORDER_WAIT_PAY.toString())
.state(States.ORDER_WAIT_SEND.toString())
.state(States.ORDER_WAIT_RECEIVE.toString())
.end(States.ORDER_FINISH.toString());
}

@Override
public void configure(StateMachineTransitionConfigurer<String, String> transitions)
throws Exception {
transitions.withExternal()
.source(States.ORDER_WAIT_PAY.toString())
.target(States.ORDER_WAIT_SEND.toString())
.event(Events.PAY_ORDER.toString())
.and()
.withExternal()
.source(States.ORDER_WAIT_SEND.toString())
.target(States.ORDER_WAIT_RECEIVE.toString())
.event(Events.SEND_ORDER.toString())
.and()
.withExternal()
.source(States.ORDER_WAIT_RECEIVE.toString())
.target(States.ORDER_FINISH.toString())
.event(Events.RECEIVE_ORDER.toString());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
package top.atluofu.fsm.config;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.config.ConfigurableBeanFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Scope;
import org.springframework.statemachine.StateMachine;
import org.springframework.statemachine.config.StateMachineFactory;
import org.springframework.statemachine.recipes.persist.PersistStateMachineHandler;
import top.atluofu.fsm.listener.OrderStatePersistChangeListener;

/**
* @ClassName: OrderStatePersistConfig
* @description: OrderStatePersistConfig
* @author: 有罗敷的马同学
* @datetime: 2023Year-12Month-01Day-8:53
* @Version: 1.0
*/
@Configuration
public class OrderStatePersistConfig {
@Autowired
private StateMachineFactory<String, String> orderStateMachineFactory;
@Autowired
private OrderStatePersistChangeListener persistStateChangeListener;

@Bean
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
public PersistStateMachineHandler getPersistStateMachineHandler() {
StateMachine<String, String> orderStateMachine = orderStateMachineFactory.getStateMachine();
PersistStateMachineHandler handler = new PersistStateMachineHandler(orderStateMachine);
handler.addPersistStateChangeListener(persistStateChangeListener);
return handler;
}

}
74 changes: 0 additions & 74 deletions fsm/src/main/java/top/atluofu/fsm/config/StateMachineConfig.java

This file was deleted.

57 changes: 33 additions & 24 deletions fsm/src/main/java/top/atluofu/fsm/controller/OrderController.java
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
package top.atluofu.fsm.controller;


import cn.hutool.core.exceptions.ValidateException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.ObjectFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.messaging.Message;
import org.springframework.messaging.support.MessageBuilder;
import org.springframework.statemachine.StateMachine;
import org.springframework.statemachine.recipes.persist.PersistStateMachineHandler;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
Expand Down Expand Up @@ -37,8 +39,8 @@ public class OrderController {
this.orderService = orderService;
}

@GetMapping("test/{name}")
public ResultUtils demo(@PathVariable String name) {
@GetMapping("test1/{name}")
public ResultUtils demo1(@PathVariable String name) {
OrderPO build = OrderPO.builder()
.orderName(name)
.state(States.ORDER_WAIT_PAY.toString())
Expand All @@ -47,39 +49,46 @@ public ResultUtils demo(@PathVariable String name) {
System.out.println(save);
System.out.println(build);
System.out.println("---------------------");
Message<Events> orderId = MessageBuilder.withPayload(Events.PAY_ORDER).setHeader("orderId", build.getId()).build();
changeStateAction(orderId, build);
Message<String> orderId1 = MessageBuilder.withPayload(Events.PAY_ORDER.toString()).setHeader("orderId", build.getId()).build();
changeStateAction(orderId1, build);
OrderPO byId = orderService.getById(build.getId());
System.out.println(byId);
return ResultUtils.success(byId);
}

@GetMapping("test2/{name}/{id}")
public ResultUtils demo2(@PathVariable String name, @PathVariable Integer id) {
OrderPO build = orderService.getById(id);
System.out.println("---------------------");
orderId = MessageBuilder.withPayload(Events.SEND_ORDER).setHeader("orderId", build.getId()).build();
changeStateAction(orderId, build);
byId = orderService.getById(build.getId());
Message<String> orderId2 = MessageBuilder.withPayload(Events.SEND_ORDER.toString()).setHeader("orderId", build.getId()).build();
changeStateAction(orderId2, build);
OrderPO byId = orderService.getById(build.getId());
System.out.println(byId);
System.out.println("---------------------");
orderId = MessageBuilder.withPayload(Events.RECEIVE_ORDER).setHeader("orderId", build.getId()).build();
changeStateAction(orderId, build);
byId = orderService.getById(build.getId());
return ResultUtils.success(byId);
}

@GetMapping("test3/{name}/{id}")
public ResultUtils demo3(@PathVariable String name, @PathVariable Integer id) {
OrderPO build = orderService.getById(id);
System.out.println("---------------------");
Message<String> orderId3 = MessageBuilder.withPayload(Events.RECEIVE_ORDER.toString()).setHeader("orderId", build.getId()).build();
changeStateAction(orderId3, build);
OrderPO byId = orderService.getById(build.getId());
System.out.println(byId);
System.out.println("---------------------");
return ResultUtils.success(byId);
}

@Autowired
private StateMachine<States, Events> orderStateMachine;

private boolean changeStateAction(Message<Events> message, OrderPO order) {
try {
//启动状态机
orderStateMachine.start();
//将Message发送给OrderStateListener
boolean res = orderStateMachine.sendEvent(message);
@Autowired
private ObjectFactory<PersistStateMachineHandler> stateMachineHandlerObjectFactory;

return res;
} catch (Exception e) {
e.printStackTrace();
} finally {
orderStateMachine.stop();
private boolean changeStateAction(Message<String> message, OrderPO order) {
PersistStateMachineHandler persistStateMachineHandler = stateMachineHandlerObjectFactory.getObject();
boolean b = persistStateMachineHandler.handleEventWithState(message, message.getPayload());
if(!b){
throw new ValidateException("失败");
}
return false;
}
Expand Down
Loading

0 comments on commit 5f4dd40

Please sign in to comment.