diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/common/code/FlowableEngineRespCode.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/common/code/FlowableEngineRespCode.java index 7fbdc0886..319e88a95 100644 --- a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/common/code/FlowableEngineRespCode.java +++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/common/code/FlowableEngineRespCode.java @@ -19,7 +19,7 @@ public enum FlowableEngineRespCode implements IModuleRespCode { ENGINE_USER_TASK_PARAM_ERROR("004", "构建后的查询审批人入参为空. 任务节点【nodeId:{}】, 该节点选择的\"审批人所在范围\"是:【{}】,请检查 cooperationOrg 参数"), ENGINE_NOTICE_CUSTOM_FLOW_ELEMENT_ERROR("005", "查询通知目标用户前参数发生异常,未获取到 WorkspaceType"), ENGINE_ASYNC_COMMAND_EXECUTION_ERROR("006", "引擎出现 SQL 相关异常, 异常信息:【{}】"), - ENGINE_ASYNC_COMMAND_EXECUTION_RETRY_GIVE_UP("007", "命令重试尝试【{}】次仍然失败,并出现异常, 将放弃"), + ENGINE_ASYNC_COMMAND_EXECUTION_RETRY_GIVE_UP("007", "命令重试尝试【{}】次仍然失败,并出现异常, 将放弃, 错误信息:{}"), ; private final String code; diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/interceptor/CustomRetryInterceptor.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/interceptor/CustomRetryInterceptor.java index c4a634bad..1c5d4e989 100644 --- a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/interceptor/CustomRetryInterceptor.java +++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/interceptor/CustomRetryInterceptor.java @@ -10,6 +10,8 @@ import org.flowable.common.engine.impl.interceptor.Command; import org.flowable.common.engine.impl.interceptor.CommandConfig; import org.flowable.common.engine.impl.interceptor.CommandExecutor; +import java.util.Objects; + import static cn.axzo.workflow.core.common.code.FlowableEngineRespCode.ENGINE_ASYNC_COMMAND_EXECUTION_RETRY_GIVE_UP; /** @@ -29,6 +31,7 @@ public class CustomRetryInterceptor extends AbstractCommandInterceptor { public T execute(CommandConfig config, Command command, CommandExecutor commandExecutor) { long waitTime = waitTimeInMs; int failedAttempts = 0; + Throwable lastException = null; do { if (failedAttempts > 0) { log.warn("Waiting for {}ms before retrying the command.", waitTime); @@ -47,12 +50,13 @@ public class CustomRetryInterceptor extends AbstractCommandInterceptor { } catch (PersistenceException e) { log.warn("Caught persistence exception: {}", e.getMessage(), e); + lastException = e; } failedAttempts++; } while (failedAttempts <= numOfRetries); - throw new WorkflowEngineException(ENGINE_ASYNC_COMMAND_EXECUTION_RETRY_GIVE_UP, String.valueOf(numOfRetries)); + throw new WorkflowEngineException(ENGINE_ASYNC_COMMAND_EXECUTION_RETRY_GIVE_UP, String.valueOf(numOfRetries), lastException.getMessage()); } protected void waitBeforeRetry(long waitTime) { diff --git a/workflow-engine-server/src/main/java/cn/axzo/workflow/server/common/aspectj/ErrorReportAspect.java b/workflow-engine-server/src/main/java/cn/axzo/workflow/server/common/aspectj/ErrorReportAspect.java index d21404b0c..9c10446ab 100644 --- a/workflow-engine-server/src/main/java/cn/axzo/workflow/server/common/aspectj/ErrorReportAspect.java +++ b/workflow-engine-server/src/main/java/cn/axzo/workflow/server/common/aspectj/ErrorReportAspect.java @@ -21,8 +21,10 @@ import org.springframework.stereotype.Component; import org.springframework.stereotype.Service; import org.springframework.util.StopWatch; import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.context.request.RequestAttributes; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; +import org.springframework.web.context.request.ServletWebRequest; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; @@ -135,6 +137,7 @@ public class ErrorReportAspect implements Ordered { if (workflowProperties.getFilterSendDingTalk().contains(operation.summary())) { filterSendDingTalk = false; } + ServletWebRequest request= (ServletWebRequest) RequestContextHolder.getRequestAttributes(); envConfig.type().executeAction(profile, operation.summary(), filterSendDingTalk, joinPoint.getArgs(), joinPoint.getSignature().toShortString(), e, workflowProperties.getFilterOperations().contains(operation.summary()));