当前位置: 首页 > news >正文

医药网站开发佛山网站建设骏域

医药网站开发,佛山网站建设骏域,如何建立一个网站的快捷方式,可以自己做网站的软件一、前言 在很多系统中#xff0c;通常会涉及到某个业务需要进行各种状态的切换操作#xff0c;例如在审批流程场景下#xff0c;某个审批的向下流转需要依赖于上一个状态的结束#xff0c;再比如电商购物场景中#xff0c;一个订单的生命周期往往伴随着不同的状态#…一、前言 在很多系统中通常会涉及到某个业务需要进行各种状态的切换操作例如在审批流程场景下某个审批的向下流转需要依赖于上一个状态的结束再比如电商购物场景中一个订单的生命周期往往伴随着不同的状态比如待支付支付完成已发货等等状态的存在让一个业务的完整流程得以串联所以状态在真实的场景中具有重要的意义。 二、spring状态机介绍 在开始学习spring状态机之前有一些概念需要弄清楚弄清这些概念才能更好的理解spring状态机。 2.1 什么是状态 在java中状态State是指对象在某一时刻所处的条件或情况类比于生活中的场景理解一台机器有运行和停止状态一个门有关闭和打开状态。状态通常是描述某种事务在某个时刻所处的一种情形。 在Spring状态机中状态State是指对象在某一时刻所处的条件或情况。状态描述了对象的特定属性、行为或情况是有限状态机Finite State MachineFSM模型中的一个重要概念。 2.2 状态的几个概念 这里特指spring状态机中关于状态的描述。在spring中状态机通常是有限状态机即事务实际发生的情形其状态是可控的在一定的范围内发生。具体来说 状态State状态是指对象在某一时刻的特定条件或情况。它描述了对象所处的状态可以是系统中的一个正常状态、初始状态或终止状态。状态是有限状态机的核心概念用于描述对象的属性和行为。事件Event事件是导致状态转换发生的触发器或信号。当系统接收到特定的事件时状态机会根据预先定义的规则将对象从当前状态转移到下一个状态。事件可以是外部输入、时间触发、条件满足等引起状态变化的因素。转移Transition转移定义了从一个状态到另一个状态的过程。它描述了状态之间的关系和转换规则指定了在接收特定事件时应该执行的状态转换操作。转移通常包括源状态、目标状态和触发转移的事件。行为Action行为也叫动作是与状态转换相关联的具体动作或逻辑。当状态机执行状态转换时可以触发与该转换相关的行为来处理额外的逻辑操作。行为可以是方法调用、数据更新、日志记录等对状态变化进行响应的操作。 2.3 什么是状态机 状态机又称有限状态机全称Finite-state machineFSM。是表示有限个状态以及在这些状态之间的转移和动作等行为的数学模型。 FSM是一种算法思想简单而言有限状态机由一组状态、一个初始状态、输入和根据输入及现有状态转换为下一个状态的转换函数组成。其作用主要是描述对象在它的生命周期内所经历的状态序列以及如何响应来自外界的各种事件。 2.4 spring 状态机 2.4.1 spring 状态机概述 Spring状态机Spring State Machine是Spring框架提供的一个模块用于帮助开发者轻松地实现状态机功能。Spring状态机模块提供了一个基于有限状态机Finite State Machine, FSM模型的框架使开发者可以定义状态、事件和状态之间的转换并能够对状态变化进行管理和监控。通过Spring状态机开发者可以更方便地实现复杂的业务逻辑、工作流程和状态管理。 2.4.2 spring 状态机特点 Spring状态机的特点包括 灵活性好 开发者可以自定义状态、事件、转换规则以及监听器以满足各种场景下的需求。 可扩展性强 Spring状态机提供了丰富的扩展点和API开发者可以根据实际需求进行扩展和定制。 易用性高 Spring状态机封装了状态机模型的复杂性提供了简洁的API和注解使得使用起来更加方便快捷。 集成方便 Spring状态机与Spring框架无缝集成可以与其他Spring组件如Spring Boot、Spring MVC等结合使用。 通过使用Spring状态机开发者可以更好地管理应用程序中的状态简化状态转换逻辑提高代码可读性和可维护性。 2.4.3 spring 状态机中的几个状态 在Spring状态机中状态通常用字符串或枚举类型表示开发者可以定义不同的状态来描述对象在系统中可能存在的各种情况。状态在状态机中扮演着重要的角色确定了对象如何响应事件以及转移到下一个状态的规则。 在使用Spring状态机时可以通过配置来定义状态并且将这些状态与具体的业务逻辑进行关联。在状态机中通常包括以下几种类型的状态 Initial State初始状态状态机启动时的初始状态是状态机的起点。只能有一个初始状态。 Normal State普通状态描述对象在系统中的一种正常状态可以根据业务需求定义多个普通状态。 Final State终止状态描述对象完成某种操作或任务后达到的结束状态表示状态机执行完毕的终点。通常对应于任务完成或异常终止等情况。 定义好状态后接着需要定义状态之间的转换规则即指定在接收特定事件时对象应该从当前状态转移到哪个状态。这样通过触发事件状态机会根据定义的规则自动进行状态转换驱动对象在不同状态下进行行为变化。 2.4.4 spring状态机原理 Spring状态机建立在有限状态机FSM的概念之上提供了一种简洁且灵活的方式来定义、管理和执行状态机 它将状态定义为Java对象并通过配置来定义状态之间的转换规则 状态转换通常由外部事件触发我们可以根据业务逻辑定义不同的事件类型并与状态转换关联 Spring状态机还提供了状态监听器用于在状态变化时执行特定的逻辑。同时状态机的状态可以持久化到数据库或其他存储介质中以便在系统重启或故障恢复时保持状态的一致性。 2.4.5 spring状态机的几个核心元素 Spring状态机核心主要包括以下三个关键元素 状态State定义了系统可能处于的各个状态。 如订单状态中的待支付、已支付等。 转换Transition描述了在何种条件下当接收到特定事件时系统可以从一个状态转移到另一个状态。 例如接收到“支付成功”事件时订单状态从“待支付”转变为“已支付”。 事件Event触发状态转换的动作或者消息它是引起状态机从当前状态迁移到新状态的原因。 2.5 spring 状态机使用场景 Spring状态机在实际应用中有许多使用场景下面列举一些常用的应用场景。 工作流管理 Spring状态机可用于实现复杂的工作流控制如订单处理、审批流程、报销流程等。通过定义不同状态和事件可以规范流程执行顺序提高工作效率和可控性。 设备控制 在物联网和嵌入式系统中设备通常存在不同的工作状态和模式。通过使用Spring状态机可以实现设备状态管理和控制如设备启动、停止、故障处理等。 订单生命周期管理 电商系统中订单状态订单生命周期包含多个状态待支付、已支付、待发货、已发货等。利用Spring状态机可以清晰地定义订单状态及状态转换规则简化订单状态管理。 流程控制 在业务系统中一些复杂的流程需要根据不同条件或事件进行状态转换。通过Spring状态机可以将业务流程分解成状态和事件实现清晰的流程控制和跟踪。 会话管理 在web应用中用户的会话状态登录登出活跃超时等可以借助状态机有效控制简化会话状态相关的复杂业务逻辑。 游戏开发 在游戏开发中状态机经常用于描述角色状态、技能释放、战斗流程等。借助Spring状态机框架开发者可以轻松地管理游戏对象的状态转换和行为逻辑。 自动化测试 在自动化测试中状态机可以用于描述测试用例的执行流程和状态切换帮助进行整体测试计划的规划和执行。 总的来说Spring状态机适用于各种需要状态管理和状态转换的场景特别是那些涉及复杂流程、状态变化频繁或需要规范化控制的应用领域。通过合理应用状态机模型可以简化系统设计、提高代码可维护性并实现更清晰、可控的业务流程和状态管理。希望这些场景示例对您有所启发。 三、与springboot整合使用 接下来演示如何在springboot中使用状态机。工程目录结构如下 3.1 操作步骤 本例将以一个订单支付的业务为场景进行说明下面来看具体的操作步骤。 3.1.1 引入依赖 parentgroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-parent/artifactIdversion2.5.5/versionrelativePath/ !-- lookup parent from repository --/parentdependenciesdependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-test/artifactIdscopetest/scope/dependencydependencygroupIdorg.springframework.statemachine/groupIdartifactIdspring-statemachine-starter/artifactIdversion2.2.1.RELEASE/version/dependency/dependenciesbuildpluginsplugingroupIdorg.springframework.boot/groupIdartifactIdspring-boot-maven-plugin/artifactId/plugin/plugins/build 3.1.2 定义订单状态枚举类 该类定义了订单在实际业务中的几种常用的状态作为后面业务逻辑操作过程中的执行依据。 状态是状态机的核心组成单元比如这里的一个订单在实际业务中的各种状态状态代表了系统或对象在某一时刻可能存在的条件或模式。在状态机中每一个状态都是系统可能处于的一种明确的条件或阶段。每个状态都是独一无二的且在任何给定时间系统只能处于其中一个状态。 public enum OrderStatusEnum {/*** 待提交*/DRAFT,/*** 待出库*/SUBMITTED,/*** 已出库*/DELIVERING,/*** 已签收*/SIGNED,/*** 已完成*/FINISHED,; } 3.1.3 定义订单事件流转枚举类 转状态换状态切换指状态之间的转变过程它是状态机模型动态性体现。当一个外部事件如用户按下按钮、接收到信号、满足特定条件等触发时状态机会从当前状态转移到另一个状态。在定义转换时需要指出触发转换的事件Event以及事件发生时系统的响应即从哪个状态Source State转到哪个状态Target State。在如下的枚举类中定义了与订单状态相对应的触发事件比如大家熟悉的订单发货订单签收等。 public enum OrderStatusOperateEventEnum {/*** 确认订单,已提交*/CONFIRMED,/*** 订单发货*/DELIVERY,/*** 订单签收*/RECEIVED,/*** 订单完成*/CONFIRMED_FINISH,; } 3.1.4 订单状态机配置类 状态机配置类是在使用Spring State Machine或其他状态机框架时的一个重要步骤该类主要用于定义状态机的核心结构包括状态states、事件events、状态之间的转换规则transitions以及可能的状态迁移动作和决策逻辑。 在Spring State Machine中创建状态机配置类通常是通过继承StateMachineConfigurerAdapter类来实现的。这个适配器类提供了几个模板方法允许开发者重写它们来配置状态机的各种组成部分 配置状态configureStates(StateMachineStateConfigurer) 该方法中开发者定义状态机中所有的状态包括初始状态initial state和结束状态final/terminal states。例如定义状态A、B、C并指定状态A作为初始状态。 配置转换configureTransitions(StateMachineTransitionConfigurer)) 在这里开发者描述状态之间的转换规则也就是当某个事件event发生时状态机如何从一个状态转移到另一个状态。例如当事件X发生时状态机从状态A转移到状态B。 配置初始状态configureInitialState(ConfigurableStateMachineInitializer) 如果需要显式指定状态机启动时的初始状态可以在该方法中设置。 import org.springframework.context.annotation.Configuration; import org.springframework.statemachine.config.EnableStateMachine; import org.springframework.statemachine.config.StateMachineConfigurerAdapter; import org.springframework.statemachine.config.builders.StateMachineStateConfigurer; import org.springframework.statemachine.config.builders.StateMachineTransitionConfigurer;import java.util.EnumSet;/*** 订单状态机配置* 处理订单流程流转与订单事件的配置*/ Configuration EnableStateMachine(name orderStateMachine) public class OrderStatusMachineConfig extends StateMachineConfigurerAdapterOrderStatusEnum, OrderStatusOperateEventEnum {/*** 设置状态机的状态 初始态和结束态* StateMachineStateConfigurer 即 状态机状态配置* param states 状态机状态* throws Exception 异常*/Overridepublic void configure(StateMachineStateConfigurerOrderStatusEnum, OrderStatusOperateEventEnum states) throws Exception {states.withStates().initial(OrderStatusEnum.DRAFT).end(OrderStatusEnum.FINISHED)//囊括了订单的所有状态.states(EnumSet.allOf(OrderStatusEnum.class));}/*** 配置状态转换与事件的关系说明了订单状态的转换与订单事件之间的关系其中source target event 是一组配合使用* param transitions* throws Exception* source 原始的状态* target 目标状态* event 通过什么事件触发*/Overridepublic void configure(StateMachineTransitionConfigurerOrderStatusEnum, OrderStatusOperateEventEnum transitions) throws Exception {transitions.withExternal().source(OrderStatusEnum.DRAFT).target(OrderStatusEnum.SUBMITTED) //待提交与待出库状态的扭转.event(OrderStatusOperateEventEnum.CONFIRMED) //待提交与待出库状态的扭转,当被触发了 CONFIRMED 这个状态的时候下同.and().withExternal().source(OrderStatusEnum.SUBMITTED).target(OrderStatusEnum.DELIVERING).event(OrderStatusOperateEventEnum.DELIVERY).and().withExternal().source(OrderStatusEnum.DELIVERING).target(OrderStatusEnum.SIGNED).event(OrderStatusOperateEventEnum.RECEIVED).and().withExternal().source(OrderStatusEnum.SIGNED).target(OrderStatusEnum.FINISHED).event(OrderStatusOperateEventEnum.CONFIRMED_FINISH);} } 3.1.5 定义状态机监听器 状态机监听器State Machine Listener是一种组件它可以监听并响应状态机在运行过程中的各种事件例如状态变迁、进入或退出状态、转换被拒绝等。 在Spring Statemachine中监听器可以通过实现StateMachineListener接口来定义。该接口提供了一系列回调方法如transitionTriggered、stateEntered、stateExited等当状态机触发转换、进入新状态或离开旧状态时这些方法会被调用。同时我们也可以通过注解实现监听器。注解方式可以在类的方法上直接声明该方法应该在何种状态下被调用简化监听器的编写和配置。例如OnTransitionOnTransitionEndOnTransitionStart等 import com.congge.entity.OrderDO; import org.springframework.messaging.Message; import org.springframework.statemachine.annotation.OnTransition; import org.springframework.statemachine.annotation.WithStateMachine; import org.springframework.stereotype.Component;Component(orderStatusListener) WithStateMachine(name orderStateMachine) public class OrderStatusListener {/*** 待提交到出库事件扭转时该方法将会被触发* param message* return*/OnTransition(source DRAFT, target SUBMITTED)public boolean pay(MessageOrderStatusOperateEventEnum message) {OrderDO order (OrderDO) message.getHeaders().get(order);order.setOrderStatusEnum(OrderStatusEnum.SUBMITTED);System.out.println(String.format(出库订单[%s]确认状态机信息%s, order.getOrderNo(), message.getHeaders()));return true;}/*** 待出库到出库的事件扭转* param message* return*/OnTransition(source SUBMITTED, target DELIVERING)public boolean deliver(MessageOrderStatusOperateEventEnum message) {OrderDO order (OrderDO) message.getHeaders().get(order);order.setOrderStatusEnum(OrderStatusEnum.DELIVERING);System.out.println(String.format(出库订单[%s]发货出库状态机信息%s, order.getOrderNo(), message.getHeaders()));return true;}/*** 出库到签收的事件扭转* param message* return*/OnTransition(source DELIVERING, target SIGNED)public boolean receive(MessageOrderStatusOperateEventEnum message){OrderDO order (OrderDO) message.getHeaders().get(order);order.setOrderStatusEnum(OrderStatusEnum.SIGNED);System.out.println(String.format(出库订单[%s]签收状态机信息%s, order.getOrderNo(), message.getHeaders()));return true;}/*** 签收到订单完成状态扭转* param message* return*/OnTransition(source SIGNED, target FINISHED)public boolean finish(MessageOrderStatusOperateEventEnum message){OrderDO order (OrderDO) message.getHeaders().get(order);order.setOrderStatusEnum(OrderStatusEnum.FINISHED);System.out.println(String.format(出库订单[%s]完成状态机信息%s, order.getOrderNo(), message.getHeaders()));return true;} } 3.1.6 配置状态机持久化类 状态机持久化是指将状态机在某一时刻的状态信息存储到数据库、缓存等介质中这样的话即使在系统重启、网络故障或进程终止等情况下状态机仍能从先前保存的状态继续执行而不是从初始状态重新开始。 在实际业务场景中如订单处理、工作流引擎、游戏进度跟踪等状态机通常用于表示某个实体在其生命周期内的状态变迁。如果没有持久化机制一旦发生意外情况导致系统宕机或重启未完成的状态变迁将会丢失这对于业务连续性和一致性是非常不利的。 状态机持久化通常涉及以下几个方面 状态记录记录当前状态机实例处于哪个状态 上下文数据除了状态外可能还需要持久化与状态关联的上下文数据例如触发状态变迁的事件参数、额外的状态属性等 历史轨迹某些复杂场景下可能需要记录状态机的历史变迁轨迹以便于审计、回溯分析或错误恢复 并发控制在多线程或多节点环境下状态机的持久化还要考虑并发访问和同步的问题 import com.congge.entity.OrderDO; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.statemachine.StateMachineContext; import org.springframework.statemachine.StateMachinePersist; import org.springframework.statemachine.persist.DefaultStateMachinePersister;import java.util.HashMap; import java.util.Map;Configuration public class OrderPersist {/*** 持久化配置* 在实际使用中可以配合数据库或者Redis等进行持久化操作* return*/Beanpublic DefaultStateMachinePersisterOrderStatusEnum, OrderStatusOperateEventEnum, OrderDO stateMachinePersister(){MapOrderDO, StateMachineContextOrderStatusEnum, OrderStatusOperateEventEnum map new HashMap();return new DefaultStateMachinePersister(new StateMachinePersistOrderStatusEnum, OrderStatusOperateEventEnum, OrderDO() {Overridepublic void write(StateMachineContextOrderStatusEnum, OrderStatusOperateEventEnum context, OrderDO order) throws Exception {//持久化操作map.put(order, context);}Overridepublic StateMachineContextOrderStatusEnum, OrderStatusOperateEventEnum read(OrderDO order) throws Exception {//从库中或者redis中读取order的状态信息return map.get(order);}});} } 3.1.7 发送状态转换类 在上面定义了状态机的监听器而监听器需要监听到状态流转的事件才会发挥作用才能监听到某个状态事件之后完成状态的变更这就需要一个 发送状态转换的处理方法。 import com.congge.entity.OrderDO; import org.springframework.messaging.Message; import org.springframework.statemachine.StateMachine; import org.springframework.statemachine.persist.StateMachinePersister; import org.springframework.stereotype.Component;import javax.annotation.Resource; import java.util.Objects;Component public class StateEventUtil {Resourceprivate StateMachineOrderStatusEnum, OrderStatusOperateEventEnum orderStateMachine;Resourceprivate StateMachinePersisterOrderStatusEnum, OrderStatusOperateEventEnum, OrderDO stateMachinePersister;/*** 发送状态转换事件* synchronized修饰保证这个方法是线程安全的* param message* return*/public synchronized boolean sendEvent(MessageOrderStatusOperateEventEnum message) {boolean result false;try {//启动状态机orderStateMachine.start();OrderDO order (OrderDO) message.getHeaders().get(order);//尝试恢复状态机状态stateMachinePersister.restore(orderStateMachine, order);result orderStateMachine.sendEvent(message);//持久化状态机状态stateMachinePersister.persist(orderStateMachine, order);} catch (Exception e) {e.printStackTrace();} finally {if (Objects.nonNull(message)) {OrderDO order (OrderDO) message.getHeaders().get(order);if (Objects.nonNull(order) Objects.equals(order.getOrderStatusEnum(), OrderStatusEnum.FINISHED)) {orderStateMachine.stop();}}}return result;} } 3.1.8 订单业务类 下面是订单核心业务逻辑的实现包括与订单的各种状态相关的方法 import com.congge.config.OrderStatusEnum; import com.congge.config.OrderStatusOperateEventEnum; import com.congge.config.StateEventUtil; import com.congge.entity.OrderDO; import com.congge.service.OrderService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.messaging.Message; import org.springframework.messaging.support.MessageBuilder; import org.springframework.stereotype.Service;import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.atomic.AtomicInteger;Service public class OrderServiceImpl implements OrderService {private StateEventUtil stateEventUtil;private static final AtomicInteger ID_COUNTER new AtomicInteger(0);private static final MapLong, OrderDO ORDER_MAP new ConcurrentHashMap();/*** 创建订单* param orderDO*/Overridepublic Long createOrder(OrderDO orderDO) {long orderId ID_COUNTER.incrementAndGet();orderDO.setOrderId(orderId);orderDO.setOrderNo(AHbb1- orderId);orderDO.setOrderStatusEnum(OrderStatusEnum.DRAFT);ORDER_MAP.put(orderId, orderDO);System.out.println(String.format(订单[%s]创建成功:, orderDO.getOrderNo()));return orderId;}/*** 确认订单** param orderId*/Overridepublic void confirmOrder(Long orderId) {OrderDO order ORDER_MAP.get(orderId);System.out.println(String.format(确认订单订单号【%s】 ,order.getOrderNo()));Message message MessageBuilder.withPayload(OrderStatusOperateEventEnum.CONFIRMED).setHeader(order, order).build();if (!stateEventUtil.sendEvent(message)) {System.out.println( 确认订单失败, 状态异常订单号 order.getOrderNo());}}/*** 订单发货** param orderId*/Overridepublic void deliver(Long orderId) {OrderDO order ORDER_MAP.get(orderId);System.out.println(订单出库当前订单号 order.getOrderNo());Message message MessageBuilder.withPayload(OrderStatusOperateEventEnum.DELIVERY).setHeader(order, order).build();if (!stateEventUtil.sendEvent(message)) {System.out.println( 订单出库失败, 状态异常订单号 order.getOrderNo());}}/*** 签收订单** param orderId*/Overridepublic void signOrder(Long orderId) {OrderDO order ORDER_MAP.get(orderId);System.out.println(订单签收订单号 order.getOrderNo());Message message MessageBuilder.withPayload(OrderStatusOperateEventEnum.RECEIVED).setHeader(order, order).build();if (!stateEventUtil.sendEvent(message)) {System.out.println( 订单签收失败, 状态异常订单号 order.getOrderNo());}}/*** 确认完成** param orderId*/Overridepublic void finishOrder(Long orderId) {OrderDO order ORDER_MAP.get(orderId);System.out.println(订单完成订单号 order.getOrderNo());Message message MessageBuilder.withPayload(OrderStatusOperateEventEnum.CONFIRMED_FINISH).setHeader(order, order).build();if (!stateEventUtil.sendEvent(message)) {System.out.println( 订单完成失败, 状态异常订单号 order.getOrderNo());}}/*** 获取所有订单信息*/Overridepublic ListOrderDO listOrders() {return new ArrayList(ORDER_MAP.values());}Autowiredpublic void setStateEventUtil(StateEventUtil stateEventUtil) {this.stateEventUtil stateEventUtil;} } 订单对象 import com.congge.config.OrderStatusEnum;public class OrderDO {private OrderStatusEnum orderStatusEnum;private Object orderNo;private long orderId;public void setOrderStatusEnum(OrderStatusEnum orderStatusEnum) {this.orderStatusEnum orderStatusEnum;}public OrderStatusEnum getOrderStatusEnum() {return orderStatusEnum;}public Object getOrderNo() {return orderNo;}public void setOrderNo(Object orderNo) {this.orderNo orderNo;}public void setOrderId(long orderId) {this.orderId orderId;}public long getOrderId() {return orderId;} } 3.1.9 测试接口 添加一个测试的接口在测试接口中开启了 两个线程理论上讲不同的线程处理有快有慢但是各自处理订单时互不影响所以对每个线程来讲都能得到订单处理的完整流程。 import com.congge.entity.OrderDO; import com.congge.service.OrderService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController;RestController RequestMapping(/order) public class OrderController {Autowiredprivate OrderService orderService;//localhost:8088/order/machine/testGetMapping(/machine/test)public void testOrderStatusMachine(){Long orderId1 orderService.createOrder(new OrderDO());Long orderId2 orderService.createOrder(new OrderDO());orderService.confirmOrder(orderId1);new Thread(客户线程1){Overridepublic void run() {orderService.deliver(orderId1);orderService.signOrder(orderId1);orderService.finishOrder(orderId1);}}.start();orderService.confirmOrder(orderId2);orderService.deliver(orderId2);orderService.signOrder(orderId2);orderService.finishOrder(orderId2);System.out.println(全部订单状态 orderService.listOrders());} } 启动工程之后调用接口http://localhost:8088/order/machine/test观察控制台输出日志信息从输出的日志信息来看与上述我们的预期也是一致的订单的状态在不同的线程中各自执行互不干扰。 3.2 待优化建议 3.2.1 状态持久化存储 上述代码中状态的存储是基于JVM内存的如果发生意外状态数据将会丢失实际业务中可以考虑采用redis或mysql进行存储。 3.2.2 异常处理 在上面的逻辑中状态机逻辑内部对异常没有做处理在状态转换过程中可能出现异常情况需要适当地捕获和处理这些异常防止状态机进入无效状态。 3.2.3 增加监控与审计 在实际应用中为了便于调试和追溯可以考虑集成日志记录或事件监听器来记录状态机的每一次状态变迁。 3.2.4 扩展性与维护性设计 伴随着业务的发展后续系统中将会增加更多的状态机因此状态机的设计应当具有足够的灵活性以便于新增状态或调整转换规则。 四、写在文末 状态机模式的这一思想在java很多技术组件中均有体现比如流程引擎一些编排用的框架甚至像设计模式中的模板模式等合理使用状态机可以让复杂的状态切换转换为模板性的操作步骤省去了复杂的业务逻辑编写大大提升效率本文到此结束感谢观看。
http://www.dnsts.com.cn/news/107584.html

相关文章:

  • 微信表情包制作网站如何利用云服务器进行网站建设
  • 做装修广告网站好酷炫网站
  • php做网站怎么样苏州工业园区gdp
  • 汽车行业市场分析那个网站做的好一个服务器可以备案几个网站吗
  • 内网建站软件网站栏目名称
  • 企业网站教程 优帮云unas做网站服务器
  • 物流网站和数据库建设四川住房和城乡建设厅网站不能打开
  • 内蒙网站建设wordpress安装插件慢
  • 做网站页面遇到的问题了解深圳网站页面设计
  • 北京微信网站建设报价单seo搜索优化工具
  • 东莞凤岗企业网站建设推广杭州 电商设计网站建设
  • 深圳提供网站建设服务平台常州网站运营公司
  • 关于旅游网站建设的方案10个零网站建设
  • 网站内部资源推广百度推广关键词质量度
  • 网站建设吉金手指专业13seo超级外链发布
  • 制作网站的商家vps云主机可以做网站
  • 2014最新网站模板-网页模板免费下载-风格吧网站开发语言用什么好
  • 广东营销型网站建设网页qq登录保护开启不了
  • 泗阳网站建设网站开发经济可行性分析怎么写
  • 网站创建流程包括哪些步骤电子商务网站多少钱
  • 网站推广机构苏州有哪些it大厂
  • 电商网站开发设计方法营销手段
  • 模板网站建设哪家专业合肥市建设工程市场信息价网站
  • 长沙市师德师风建设网站电商培训机构哪家强
  • 建设一个旅游电子商务网站东莞阳光网官网投诉中心
  • 高端网站建设 来磐石网络郑州建设局网站
  • wordpress官方文档网站建设与优化计入什么科莫
  • 凡科网上传网站wordpress 设置导航
  • 网站开发需要哪些文档展厅设计包括哪些内容
  • 福建百益建设集团有限公司网站做网站用的腾讯云服务器