195 lines
7.9 KiB
Java
195 lines
7.9 KiB
Java
|
|
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<Status, Event> stateMachineFactory;
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 启动任务处理流程
|
|||
|
|
*/
|
|||
|
|
public void startTask(String taskId) {
|
|||
|
|
logger.info("\n========== 开始任务处理流程 ==========");
|
|||
|
|
|
|||
|
|
StateMachine<Status, Event> 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<Status, Event> 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<Status, Event> 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<Status, Event> 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();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|