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

195 lines
7.9 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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