+ * 监听Flowable流程引擎的全生命周期事件,实现算例状态的实时同步: + * - PROCESS_COMPLETED: 流程正常完成 + * - PROCESS_CANCELLED: 流程被取消/终止 + * - ENTITY_SUSPENDED: 实体挂起(需过滤流程实例) + * - ENTITY_ACTIVATED: 实体激活(需过滤流程实例) + * - JOB_MOVED_TO_DEADLETTER: 作业移入死信队列(ERROR状态) + *
+ * + * @author SDM + * @date 2026-01-23 + */ +@Slf4j +@Component +public class GlobalStatusEventListener implements FlowableEventListener { + + @Autowired + private ISimulationRunFeignClient simulationRunFeignClient; + + @Override + public Set
+ * 前提条件:ServiceTask必须配置async="true"和R0/PT0S重试策略
+ */
+ private void handleDeadLetter(FlowableEngineEntityEvent event) {
+ Object entity = event.getEntity();
+
+ if (entity instanceof Job) {
+ Job job = (Job) entity;
+ String processInstanceId = job.getProcessInstanceId();
+ String exceptionMessage = job.getExceptionMessage();
+
+ log.error("❌ 作业进入死信队列,流程ERROR: processInstanceId={}, jobId={}, exception={}",
+ processInstanceId, job.getId(), exceptionMessage);
+
+ doUpdate(processInstanceId, ProcessInstanceStateEnum.ERROR.getCode());
+ }
+ }
+
+ /**
+ * 真正的更新数据库逻辑
+ * 通过Feign调用project服务更新算例状态
+ */
+ private void doUpdate(String processInstanceId, Integer statusCode) {
+ if (processInstanceId == null) {
+ log.warn("流程实例ID为空,跳过状态更新");
+ return;
+ }
+
+ log.info(">>> 更新算例状态 [{}] -> {}", processInstanceId, statusCode);
+ try {
+ simulationRunFeignClient.updateStatusByProcessInstanceId(processInstanceId, statusCode);
+ } catch (Exception e) {
+ log.error("更新算例状态失败: processInstanceId={}, status={}", processInstanceId, statusCode, e);
+ }
+ }
+
+ @Override
+ public boolean isFailOnException() {
+ // 返回false:即使监听器抛异常,也不影响流程继续执行
+ // 这是容错设计,保证业务流程的稳定性
+ return false;
+ }
+
+ @Override
+ public boolean isFireOnTransactionLifecycleEvent() {
+ // 返回false:在事务提交前触发,确保状态及时更新
+ // 如果返回true,监听器会在事务提交后触发,可能导致状态更新滞后
+ return false;
+ }
+
+ @Override
+ public String getOnTransaction() {
+ return null;
+ }
+}
diff --git a/flowable/src/main/java/com/sdm/flowable/process/ProcessService.java b/flowable/src/main/java/com/sdm/flowable/process/ProcessService.java
index e4834e87..0d814b3f 100644
--- a/flowable/src/main/java/com/sdm/flowable/process/ProcessService.java
+++ b/flowable/src/main/java/com/sdm/flowable/process/ProcessService.java
@@ -472,11 +472,11 @@ public class ProcessService implements Iprocess{
if (isRunning) {
// --- 运行中 ---
if (hasError) {
- status = ProcessInstanceStateEnum.ERROR.getCode(); // 有死信作业,视为异常
+ status = ProcessInstanceStateEnum.ERROR.getValue(); // 有死信作业,视为异常
} else if (isSuspended) {
- status = ProcessInstanceStateEnum.SUSPENDED.getCode(); // 被挂起
+ status = ProcessInstanceStateEnum.SUSPENDED.getValue(); // 被挂起
} else {
- status = ProcessInstanceStateEnum.RUNNING.getCode(); // 正常运行
+ status = ProcessInstanceStateEnum.RUNNING.getValue(); // 正常运行
}
} else {
// --- 已结束 (运行时查不到,历史表里有) ---
@@ -484,11 +484,11 @@ public class ProcessService implements Iprocess{
if (deleteReason == null) {
// 1. 正常走完结束节点,deleteReason 为空
- status = ProcessInstanceStateEnum.COMPLETED.getCode();
+ status = ProcessInstanceStateEnum.COMPLETED.getValue();
} else {
// 2. 有删除原因,说明是被取消或强制终止的
// 你可以根据 reason 的内容做更细的区分,或者统称为 cancelled
- status = ProcessInstanceStateEnum.CANCELLED.getCode();
+ status = ProcessInstanceStateEnum.CANCELLED.getValue();
}
}
info.setStatus(status);
diff --git a/project/src/main/java/com/sdm/project/controller/SimulationRunController.java b/project/src/main/java/com/sdm/project/controller/SimulationRunController.java
index 800b2bd8..af96589c 100644
--- a/project/src/main/java/com/sdm/project/controller/SimulationRunController.java
+++ b/project/src/main/java/com/sdm/project/controller/SimulationRunController.java
@@ -395,4 +395,13 @@ public class SimulationRunController implements ISimulationRunFeignClient {
return runService.syncKeyResultToTask(req);
}
+ /**
+ * 根据流程实例ID更新算例状态 (内部调用)
+ * 由Flowable全局事件监听器调用
+ */
+ @PostMapping("/updateStatusByProcessInstanceId")
+ public SdmResponse updateStatusByProcessInstanceId(@RequestParam String processInstanceId, @RequestParam Integer statusCode) {
+ return runService.updateStatusByProcessInstanceId(processInstanceId, statusCode);
+ }
+
}
\ No newline at end of file
diff --git a/project/src/main/java/com/sdm/project/service/ISimulationRunService.java b/project/src/main/java/com/sdm/project/service/ISimulationRunService.java
index 7b09631d..22fc4ec2 100644
--- a/project/src/main/java/com/sdm/project/service/ISimulationRunService.java
+++ b/project/src/main/java/com/sdm/project/service/ISimulationRunService.java
@@ -110,4 +110,12 @@ public interface ISimulationRunService extends IService