package com.tuoheng.status.statemachine.service; import com.tuoheng.status.statemachine.events.Event; import com.tuoheng.status.statemachine.status.Status; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.statemachine.StateMachine; import org.springframework.statemachine.config.StateMachineFactory; import org.springframework.stereotype.Service; import java.util.logging.Logger; /** * 任务状态机服务示例 * 演示如何使用状态机 */ @Service public class TaskStateMachineService { private static final Logger logger = Logger.getLogger(TaskStateMachineService.class.getName()); @Autowired private StateMachineFactory stateMachineFactory; /** * 启动任务处理流程 */ public void startTask(String taskId) { logger.info("\n========== 开始任务处理流程 =========="); StateMachine stateMachine = stateMachineFactory.getStateMachine(); try { // 设置任务ID到扩展状态 stateMachine.getExtendedState().getVariables().put("taskId", taskId); stateMachine.getExtendedState().getVariables().put("retryCount", 0); // 启动状态机 stateMachine.start(); logger.info("状态机已启动,当前状态: " + stateMachine.getState().getId()); // 发送 START 事件 logger.info("\n--- 发送 START 事件 ---"); stateMachine.sendEvent(Event.START); logger.info("当前状态: " + stateMachine.getState().getId()); // 模拟准备完成 Thread.sleep(100); stateMachine.getExtendedState().getVariables().put("prepared", true); logger.info("\n--- 发送 PREPARE 事件 ---"); stateMachine.sendEvent(Event.PREPARE); logger.info("当前状态: " + stateMachine.getState().getId()); // 模拟执行完成(在发送事件之前设置结果,以便 Guard 可以检查) Thread.sleep(200); stateMachine.getExtendedState().getVariables().put("executionResult", "success"); logger.info("\n--- 发送 EXECUTE 事件 ---"); stateMachine.sendEvent(Event.EXECUTE); logger.info("当前状态: " + stateMachine.getState().getId()); // 模拟验证完成(在发送事件之前设置验证结果,以便 Guard 可以检查) Thread.sleep(100); stateMachine.getExtendedState().getVariables().put("validationResult", true); logger.info("\n--- 发送 VALIDATE 事件 ---"); stateMachine.sendEvent(Event.VALIDATE); logger.info("当前状态: " + stateMachine.getState().getId()); logger.info("\n========== 任务处理流程完成 ==========\n"); } catch (Exception e) { logger.severe("处理任务时发生错误: " + e.getMessage()); e.printStackTrace(); } finally { // 停止状态机 stateMachine.stop(); } } /** * 演示失败和重试流程 */ public void demonstrateFailureAndRetry(String taskId) { logger.info("\n========== 演示失败和重试流程 =========="); StateMachine stateMachine = stateMachineFactory.getStateMachine(); try { // 设置任务ID stateMachine.getExtendedState().getVariables().put("taskId", taskId); stateMachine.getExtendedState().getVariables().put("retryCount", 0); // 启动状态机 stateMachine.start(); logger.info("状态机已启动,当前状态: " + stateMachine.getState().getId()); // 发送 START 事件 logger.info("\n--- 发送 START 事件 ---"); stateMachine.sendEvent(Event.START); logger.info("当前状态: " + stateMachine.getState().getId()); // 模拟失败 logger.info("\n--- 发送 FAIL 事件(模拟失败)---"); stateMachine.sendEvent(Event.FAIL); logger.info("当前状态: " + stateMachine.getState().getId()); // 增加重试次数 Integer retryCount = (Integer) stateMachine.getExtendedState().getVariables().getOrDefault("retryCount", 0); stateMachine.getExtendedState().getVariables().put("retryCount", retryCount + 1); // 重试 logger.info("\n--- 发送 RETRY 事件 ---"); stateMachine.sendEvent(Event.RETRY); logger.info("当前状态: " + stateMachine.getState().getId()); logger.info("\n========== 失败和重试流程演示完成 ==========\n"); } catch (Exception e) { logger.severe("演示失败和重试流程时发生错误: " + e.getMessage()); e.printStackTrace(); } finally { stateMachine.stop(); } } /** * 演示 Guard 条件不满足的情况 */ public void demonstrateGuardFailure(String taskId) { logger.info("\n========== 演示 Guard 条件不满足 =========="); StateMachine stateMachine = stateMachineFactory.getStateMachine(); try { // 不设置 taskId,导致 CanStartGuard 失败 // stateMachine.getExtendedState().getVariables().put("taskId", taskId); // 启动状态机 stateMachine.start(); logger.info("状态机已启动,当前状态: " + stateMachine.getState().getId()); // 发送 START 事件(应该失败,因为 Guard 条件不满足) logger.info("\n--- 发送 START 事件(没有 taskId,Guard 应该失败)---"); boolean accepted = stateMachine.sendEvent(Event.START); logger.info("事件是否被接受: " + accepted); logger.info("当前状态: " + stateMachine.getState().getId()); logger.info("\n========== Guard 条件不满足演示完成 ==========\n"); } catch (Exception e) { logger.severe("演示 Guard 失败时发生错误: " + e.getMessage()); e.printStackTrace(); } finally { stateMachine.stop(); } } /** * 演示重置流程 */ public void demonstrateReset(String taskId) { logger.info("\n========== 演示重置流程 =========="); StateMachine stateMachine = stateMachineFactory.getStateMachine(); try { // 设置任务ID stateMachine.getExtendedState().getVariables().put("taskId", taskId); // 启动状态机并完成流程 stateMachine.start(); stateMachine.sendEvent(Event.START); stateMachine.getExtendedState().getVariables().put("prepared", true); stateMachine.sendEvent(Event.PREPARE); stateMachine.getExtendedState().getVariables().put("executionResult", "success"); stateMachine.sendEvent(Event.EXECUTE); stateMachine.getExtendedState().getVariables().put("validationResult", true); stateMachine.sendEvent(Event.VALIDATE); logger.info("当前状态: " + stateMachine.getState().getId()); // 重置 logger.info("\n--- 发送 RESET 事件 ---"); stateMachine.sendEvent(Event.RESET); logger.info("当前状态: " + stateMachine.getState().getId()); logger.info("\n========== 重置流程演示完成 ==========\n"); } catch (Exception e) { logger.severe("演示重置流程时发生错误: " + e.getMessage()); e.printStackTrace(); } finally { stateMachine.stop(); } } }