diff --git a/backend/src/main/java/com/qqchen/deploy/backend/framework/exception/BaseException.java b/backend/src/main/java/com/qqchen/deploy/backend/framework/exception/BaseException.java index 7cb637e2..39eb64d5 100644 --- a/backend/src/main/java/com/qqchen/deploy/backend/framework/exception/BaseException.java +++ b/backend/src/main/java/com/qqchen/deploy/backend/framework/exception/BaseException.java @@ -1,6 +1,7 @@ package com.qqchen.deploy.backend.framework.exception; import com.qqchen.deploy.backend.framework.enums.ResponseCode; +import com.qqchen.deploy.backend.framework.utils.MessageUtils; import lombok.Getter; @Getter @@ -19,8 +20,18 @@ public abstract class BaseException extends RuntimeException { } protected BaseException(ResponseCode errorCode, Object[] args, Throwable cause) { - super(cause); + super(buildMessage(errorCode, args), cause); this.errorCode = errorCode; this.args = args; } -} \ No newline at end of file + + private static String buildMessage(ResponseCode errorCode, Object[] args) { + if (errorCode == null) { + return null; + } + if (args == null || args.length == 0) { + return MessageUtils.getMessage(errorCode.getMessageKey()); + } + return MessageUtils.getMessage(errorCode.getMessageKey(), args); + } +} \ No newline at end of file diff --git a/backend/src/main/java/com/qqchen/deploy/backend/workflow/delegate/BaseNodeDelegate.java b/backend/src/main/java/com/qqchen/deploy/backend/workflow/delegate/BaseNodeDelegate.java index ac095e4d..2fbd52e9 100644 --- a/backend/src/main/java/com/qqchen/deploy/backend/workflow/delegate/BaseNodeDelegate.java +++ b/backend/src/main/java/com/qqchen/deploy/backend/workflow/delegate/BaseNodeDelegate.java @@ -58,12 +58,13 @@ public abstract class BaseNodeDelegate implements JavaDelegate { // 当前执行上下文(用于日志记录) private String currentProcessInstanceId; + private String currentNodeId; - // ✅ 预初始化的输出对象(子类可以直接访问和修改) + // 预初始化的输出对象(子类可以直接访问和修改) protected O output; - // ✅ 当前输入映射对象(用于读取 continueOnFailure 等配置) + // 当前输入映射对象(用于读取 continueOnFailure 等配置) protected I currentInputMapping; @Override @@ -103,21 +104,20 @@ public abstract class BaseNodeDelegate implements JavaDelegate { } catch (Exception e) { // ❌ 业务异常:根据 continueOnFailure 配置决定行为 log.error("Business exception in node: {}", currentNodeId, e); - + boolean continueOnFailure = WorkflowUtils.getContinueOnFailure(currentInputMapping); if (continueOnFailure) { - // ⚠️ 非阻断模式:标记失败但流程继续 - log.warn("⚠️ Node failed (continue mode enabled by config): {}", e.getMessage()); + // 非阻断模式:标记失败但流程继续 + log.error("Node failed (continue mode enabled by config): {}", e.getMessage()); markFailure(e); - // 保存失败状态的 NodeContext nodeContext.setConfigs(configsMap); nodeContext.setInputMapping(inputMappingObj); nodeContext.setOutputs(this.output); execution.setVariable(currentNodeId, nodeContext.toMap(objectMapper)); } else { - // ❌ 阻断模式:终止流程(默认行为) - log.error("❌ Node failed (terminate mode, default): {}", e.getMessage()); + //阻断模式:终止流程(默认行为) + log.error("Node failed (terminate mode, default): {}", e.getMessage()); terminateWorkflow(e); // 抛出 BpmnError,触发流程终止 } } @@ -268,10 +268,10 @@ public abstract class BaseNodeDelegate implements JavaDelegate { */ protected void terminateWorkflow(String errorCode, String errorMessage) { log.error("🛑 Terminating workflow: errorCode={}, message={}", errorCode, errorMessage); - + // 自动记录错误日志到 Redis Stream logError(errorMessage); - + throw new org.flowable.engine.delegate.BpmnError(errorCode, errorMessage); } @@ -294,8 +294,8 @@ public abstract class BaseNodeDelegate implements JavaDelegate { * @param exception 异常对象 */ protected void terminateWorkflow(Exception exception) { - String errorMessage = exception.getMessage() != null - ? exception.getMessage() + String errorMessage = exception.getMessage() != null + ? exception.getMessage() : exception.getClass().getSimpleName(); terminateWorkflow(errorMessage); } @@ -337,7 +337,6 @@ public abstract class BaseNodeDelegate implements JavaDelegate { } - /** * 创建失败状态的输出对象(非致命错误,流程继续) *

@@ -413,7 +412,7 @@ public abstract class BaseNodeDelegate implements JavaDelegate { if (outputs instanceof BaseNodeOutputs) { ((BaseNodeOutputs) outputs).setStatus(NodeExecutionStatusEnum.SUCCESS); - + // ✅ 自动生成默认成功消息 String nodeName = WorkflowUtils.extractNodeName(configsMap); ((BaseNodeOutputs) outputs).setMessage(nodeName + "执行成功"); @@ -435,7 +434,7 @@ public abstract class BaseNodeDelegate implements JavaDelegate { /** * 记录错误日志到 Redis Stream - * + * * @param message 错误信息 */ protected void logError(String message) { @@ -457,7 +456,7 @@ public abstract class BaseNodeDelegate implements JavaDelegate { /** * 记录警告日志到 Redis Stream - * + * * @param message 警告信息 */ protected void logWarn(String message) { @@ -478,7 +477,7 @@ public abstract class BaseNodeDelegate implements JavaDelegate { /** * 记录信息日志到 Redis Stream - * + * * @param message 信息内容 */ protected void logInfo(String message) { diff --git a/backend/src/main/java/com/qqchen/deploy/backend/workflow/delegate/JenkinsBuildDelegate.java b/backend/src/main/java/com/qqchen/deploy/backend/workflow/delegate/JenkinsBuildDelegate.java index b2b09d7f..59ce3ff5 100644 --- a/backend/src/main/java/com/qqchen/deploy/backend/workflow/delegate/JenkinsBuildDelegate.java +++ b/backend/src/main/java/com/qqchen/deploy/backend/workflow/delegate/JenkinsBuildDelegate.java @@ -94,7 +94,7 @@ public class JenkinsBuildDelegate extends BaseNodeDelegate