From 79d311354c6195e8fdc709809722b5f0d3770dba Mon Sep 17 00:00:00 2001 From: gulongcheng <474084054@qq.com> Date: Thu, 11 Dec 2025 20:22:54 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B5=81=E7=A8=8B=E7=8A=B6=E6=80=81=E4=BC=98?= =?UTF-8?q?=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sdm/flowable/process/ProcessService.java | 69 ++++++++++--------- pbs/src/main/resources/bin/start.sh | 2 +- project/src/main/resources/bin/start.sh | 2 +- system/src/main/resources/bin/start.sh | 2 +- task/src/main/resources/bin/start.sh | 2 +- 5 files changed, 40 insertions(+), 37 deletions(-) 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 e63c2adc..5ed8cfd6 100644 --- a/flowable/src/main/java/com/sdm/flowable/process/ProcessService.java +++ b/flowable/src/main/java/com/sdm/flowable/process/ProcessService.java @@ -274,65 +274,66 @@ public class ProcessService implements Iprocess{ .processInstanceId(processInstanceId) .list(); - Map activityMap = new HashMap<>(); + Map historicActivityInstanceHashMap = new HashMap<>(); for (HistoricActivityInstance hist : historicActivities) { - if (!activityMap.containsKey(hist.getActivityId()) || - hist.getStartTime().after(activityMap.get(hist.getActivityId()).getStartTime())) { - activityMap.put(hist.getActivityId(), hist); + if (!historicActivityInstanceHashMap.containsKey(hist.getActivityId()) || + hist.getStartTime().after(historicActivityInstanceHashMap.get(hist.getActivityId()).getStartTime())) { + historicActivityInstanceHashMap.put(hist.getActivityId(), hist); } } // 3. 准备运行时 Active ID 列表 + // 注意:重试中的任务(Active Job)一定包含在这里面,所以它会被标记为 isActive = true List activeActivityIds = isRunning ? runtimeService.getActiveActivityIds(processInstanceId) : Collections.emptyList(); - // 4. 准备异常信息 (DeadLetterJob 代表严重错误/失败) + // 4. 准备异常信息 (仅关注 DeadLetterJob - 彻底失败的任务) Map errorMap = new HashMap<>(); - boolean hasDeadLetterJobs = false; // 标记流程是否有死信 + boolean hasDeadLetterJobs = false; if (isRunning) { - // 死信作业 (DeadLetterJob) - 彻底失败 + // 只查死信作业 List deadJobs = managementService.createDeadLetterJobQuery() .processInstanceId(processInstanceId).list(); + if (!deadJobs.isEmpty()) { hasDeadLetterJobs = true; - } - // 普通作业 (Job) - 包含重试中的异常 - List activeJobs = managementService.createJobQuery() - .processInstanceId(processInstanceId).list(); + // 【优化】:只有存在死信时,才去查 Execution 映射 ActivityId + // 这样重试中的流程(无死信)可以少查一次数据库 + List executions = runtimeService.createExecutionQuery() + .processInstanceId(processInstanceId).list(); + Map executionToActivityMap = executions.stream() + .filter(e -> e.getActivityId() != null) + .collect(Collectors.toMap(Execution::getId, Execution::getActivityId, (v1, v2) -> v1)); - // 映射 ExecutionId -> ActivityId - List executions = runtimeService.createExecutionQuery() - .processInstanceId(processInstanceId).list(); - Map executionToActivityMap = executions.stream() - .filter(e -> e.getActivityId() != null) - .collect(Collectors.toMap(Execution::getId, Execution::getActivityId, (v1, v2) -> v1)); - - Consumer mapJobToError = job -> { - if (job.getExceptionMessage() != null) { - String activityId = executionToActivityMap.get(job.getExecutionId()); - if (activityId != null) { - errorMap.put(activityId, job.getExceptionMessage()); + for (Job job : deadJobs) { + if (job.getExceptionMessage() != null) { + String activityId = executionToActivityMap.get(job.getExecutionId()); + if (activityId != null) { + errorMap.put(activityId, job.getExceptionMessage()); + } } } - }; - deadJobs.forEach(mapJobToError); - activeJobs.forEach(mapJobToError); + } + // 【已移除】:原有的 createJobQuery (activeJobs) 查询逻辑。 + // 解释:重试中的任务虽然带有异常信息,但在业务逻辑上视为“正在执行(Active)”,不视为“错误(Error)”。 } // --- 5. 构建流程实例级状态 (ProcessInfo) --- - // 这里传入新的状态标志:hasDeadLetterJobs, isProcessSuspended + // 只要 hasDeadLetterJobs 为 false,流程状态就会显示为 running (或 suspended) processInfo = buildProcessInstanceInfo(processInstanceId, isRunning, isProcessSuspended, hasDeadLetterJobs); // --- 6. 构建节点级状态 --- for (NodeDetailInfo node : nodes) { String originalNodeId = node.getId(); - HistoricActivityInstance myHist = activityMap.get(originalNodeId); + HistoricActivityInstance myHist = historicActivityInstanceHashMap.get(originalNodeId); boolean isActive = activeActivityIds.contains(originalNodeId); boolean isFinished = myHist != null && myHist.getEndTime() != null; + + // 只有死信表里的才算 Error String errorMessage = errorMap.get(originalNodeId); boolean isError = errorMessage != null; @@ -340,9 +341,10 @@ public class ProcessService implements Iprocess{ String displayStatus; if (isError) { - displayStatus = "error"; // 节点报错优先 + displayStatus = "error"; // 彻底挂死:红色 } else if (isActive) { - // 【优化点】:如果节点是 Active,但流程是 Suspended,则节点状态为 suspended + // 如果是重试任务:isError=false, isActive=true -> 进入这里 -> 显示为 Active (蓝色) + // 同时兼容挂起状态显示 if (isProcessSuspended) { displayStatus = "suspended"; } else { @@ -358,18 +360,18 @@ public class ProcessService implements Iprocess{ Date endTime = myHist != null ? myHist.getEndTime() : null; Long duration = myHist != null ? myHist.getDurationInMillis() : null; - // ServiceTask 异步回调逻辑特殊处理 (保持原有逻辑,叠加挂起判断) + // ServiceTask 异步回调逻辑特殊处理 if (isAsyncCallbackNode(node)) { if (isError) { node.setErrorMessage(errorMessage); } else { String waitNodeId = FlowNodeIdUtils.generateAsyncTaskId(originalNodeId); - HistoricActivityInstance waitHist = activityMap.get(waitNodeId); + HistoricActivityInstance waitHist = historicActivityInstanceHashMap.get(waitNodeId); boolean waitIsActive = activeActivityIds.contains(waitNodeId); boolean waitIsFinished = waitHist != null && waitHist.getEndTime() != null; if (waitIsActive) { - // 同样:如果 ReceiveTask 等待中,但流程挂起,显示挂起 + // 等待回调中,同样受挂起状态影响 displayStatus = isProcessSuspended ? "suspended" : "active"; endTime = null; if (startTime != null) { @@ -382,6 +384,7 @@ public class ProcessService implements Iprocess{ duration = endTime.getTime() - startTime.getTime(); } } else if (isFinished && !waitIsFinished && !waitIsActive) { + // 刚发完 ServiceTask,还没生成 ReceiveTask 的中间态 displayStatus = isProcessSuspended ? "suspended" : "active"; endTime = null; } diff --git a/pbs/src/main/resources/bin/start.sh b/pbs/src/main/resources/bin/start.sh index e7c6ee4d..f1525085 100644 --- a/pbs/src/main/resources/bin/start.sh +++ b/pbs/src/main/resources/bin/start.sh @@ -42,4 +42,4 @@ fi # 启动项目 echo "正在启动项目..." -nohup java ${JVM_OPTS} -Dspring.profiles.active=prod -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=0.0.0.0:5004 -jar "${FULL_JAR_PATH}" > "${LOG_FILE}" 2>&1 & +nohup java ${JVM_OPTS} -Dspring.profiles.active=dev -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=0.0.0.0:5004 -jar "${FULL_JAR_PATH}" > "${LOG_FILE}" 2>&1 & diff --git a/project/src/main/resources/bin/start.sh b/project/src/main/resources/bin/start.sh index 0c88247e..c82c4e65 100644 --- a/project/src/main/resources/bin/start.sh +++ b/project/src/main/resources/bin/start.sh @@ -42,4 +42,4 @@ fi echo "正在启动项目... " # 启动项目并保留控制台输出 -nohup java ${JVM_OPTS} -Dspring.profiles.active=prod -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=0.0.0.0:5005 -jar "${FULL_JAR_PATH}" > "${LOG_FILE}" 2>&1 & +nohup java ${JVM_OPTS} -Dspring.profiles.active=dev -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=0.0.0.0:5005 -jar "${FULL_JAR_PATH}" > "${LOG_FILE}" 2>&1 & diff --git a/system/src/main/resources/bin/start.sh b/system/src/main/resources/bin/start.sh index b60925b8..43ae1540 100644 --- a/system/src/main/resources/bin/start.sh +++ b/system/src/main/resources/bin/start.sh @@ -42,5 +42,5 @@ fi echo "正在启动项目..." # 启动项目,保留控制台输出 -nohup java ${JVM_OPTS} -Dspring.profiles.active=prod -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=0.0.0.0:5006 -jar "${FULL_JAR_PATH}" > "${LOG_FILE}" 2>&1 & +nohup java ${JVM_OPTS} -Dspring.profiles.active=dev -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=0.0.0.0:5006 -jar "${FULL_JAR_PATH}" > "${LOG_FILE}" 2>&1 & diff --git a/task/src/main/resources/bin/start.sh b/task/src/main/resources/bin/start.sh index 1bfccb3f..ec8c51b9 100644 --- a/task/src/main/resources/bin/start.sh +++ b/task/src/main/resources/bin/start.sh @@ -43,5 +43,5 @@ echo "正在启动项目..." echo "======================================================================" # 启动项目,保留控制台输出 -nohup java ${JVM_OPTS} -Dspring.profiles.active=prod -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=0.0.0.0:5007 -jar "${FULL_JAR_PATH}" > "${LOG_FILE}" 2>&1 & +nohup java ${JVM_OPTS} -Dspring.profiles.active=dev -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=0.0.0.0:5007 -jar "${FULL_JAR_PATH}" > "${LOG_FILE}" 2>&1 &