旅行社网站建设需求分析临沂网站设计
旅行社网站建设需求分析,临沂网站设计,齐齐哈尔铁峰建设局网站,python源码下载描述 在 Spring Boot 中实现状态机#xff0c;通常使用 Spring State Machine 框架进行实现。该框架可以帮助我们定义、创建和管理复杂的状态机。 接下来给出一个demo#xff0c;说明如何使用 Spring State Machine 框架实现状态机。 假设我们需要实现一个简单的订单状态机通常使用 Spring State Machine 框架进行实现。该框架可以帮助我们定义、创建和管理复杂的状态机。 接下来给出一个demo说明如何使用 Spring State Machine 框架实现状态机。 假设我们需要实现一个简单的订单状态机订单的状态可以是已创建、已确认、已发货、已完成和已取消。在订单生命周期中可以有以下事件 - 确认订单confirmOrder从已创建状态转换到已确认状态。
- 发货shipOrder从已确认状态转换到已发货状态。
- 确认收货receiveOrder从已发货状态转换到已完成状态。
- 取消订单cancelOrder从已创建或已确认状态转换到已取消状态。 现在让我们来实现这个订单状态机。 代码 在 pom.xml 文件中添加以下依赖 xml
dependency groupIdorg.springframework.statemachine/groupId artifactIdspring-statemachine-core/artifactId version2.1.2.RELEASE/version
/dependency 对于该状态机我们可以定义以下枚举状态以及事件 java
public enum States { CREATED, CONFIRMED, SHIPPED, COMPLETED, CANCELLED
} java
public enum Events { CONFIRM_ORDER, SHIP_ORDER, RECEIVE_ORDER, CANCEL_ORDER
} 创建一个状态机配置类用于管理状态机的定义和创建。从 StateMachineConfigurerAdapter 继承并添加 Configuration 和 EnableStateMachine 注解。 java
Configuration
EnableStateMachine
public class OrderStateMachineConfig extends StateMachineConfigurerAdapterStates, Events { Override public void configure(StateMachineStateConfigurerStates, Events states) throws Exception { states .withStates() .initial(States.CREATED) .state(States.CONFIRMED) .state(States.SHIPPED) .state(States.COMPLETED) .state(States.CANCELLED) .end(States.COMPLETED) .end(States.CANCELLED); } Override public void configure(StateMachineTransitionConfigurerStates, Events transitions) throws Exception { transitions .withExternal() .source(States.CREATED) .target(States.CONFIRMED) .event(Events.CONFIRM_ORDER) .and() .withExternal() .source(States.CONFIRMED) .target(States.SHIPPED) .event(Events.SHIP_ORDER) .and() .withExternal() .source(States.SHIPPED) .target(States.COMPLETED) .event(Events.RECEIVE_ORDER) .and() .withExternal() .source(States.CREATED) .target(States.CANCELLED) .event(Events.CANCEL_ORDER) .and() .withExternal() .source(States.CONFIRMED) .target(States.CANCELLED) .event(Events.CANCEL_ORDER); }
} 在上述通过 Config 注解启用了 State Machine 的例子中我们定义了状态机的状态和事件转换分别是通过 configure 方法实现 StateMachineStateConfigurer 和 StateMachineTransitionConfigurer。我们定义了订单状态和事件定义了每个状态可以发生的转换其中 withExternal() 表示外部转换。 接下来我们创建一个状态机服务该服务将使用上述状态机配置进行初始化然后使用状态机按照规定的转换流程进行状态转换。 java
Service
public class OrderStateMachineService { Autowired private StateMachineStates, Events stateMachine; public boolean sendEvent(final String orderId, final Events event) { stateMachine.start(); MessageEvents message MessageBuilder.withPayload(event) .setHeader(orderId, orderId) .build(); return stateMachine.sendEvent(message); }
} 我们注入了 StateMachineStates, Events 类型的 stateMachine 对象并定义了一个事件触发方法 sendEvent()。该方法通过设置事件消息的负载将事件发送给状态机进行状态转换。 我们测试一下 java
RestController
RequestMapping(/order)
public class OrderController { Autowired private OrderStateMachineService orderStateMachineService; PostMapping(/confirm) public boolean confirmOrder(RequestBody final Order order) { return orderStateMachineService.sendEvent(order.getId(), Events.CONFIRM_ORDER); } PostMapping(/ship) public boolean shipOrder(RequestBody final Order order) { return orderStateMachineService.sendEvent(order.getId(), Events.SHIP_ORDER); } PostMapping(/receive) public boolean receiveOrder(RequestBody final Order order) { return orderStateMachineService.sendEvent(order.getId(), Events.RECEIVE_ORDER); } PostMapping(/cancel) public boolean cancelOrder(RequestBody final Order order) { return orderStateMachineService.sendEvent(order.getId(), Events.CANCEL_ORDER); }
} 测试结果如下 1、以上接口依次调用程序正常 2、不按顺序调用会报错 优缺点说明 1、这种实现方式会受集群部署影响因为这些状态是存在内存中的当然可以通过其它方式解决比如持久化道数据库中 2、如果订单周期比较长并且数据量比较大放在内存中会引发oom
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/89707.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!