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();
|
||
}
|
||
}
|
||
}
|