thingsboard-client-demo/src/main/java/com/tuoheng/status/statemachine/service/TaskStateMachineService.java

195 lines
7.9 KiB
Java
Raw Normal View History

2025-12-15 16:27:55 +08:00
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 事件(没有 taskIdGuard 应该失败)---");
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();
}
}
}