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 91443883f..c712329cb 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 @@ -18,6 +18,8 @@ public enum FlowableEngineRespCode implements IModuleRespCode { ENGINE_USER_TASK_TYPE_NOT_SUPPORT("003", "审批指定方式暂不支持"), 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", "命令重试尝试【{}】次仍然失败,并出现 PersistenceException, 将放弃"), ; private String code; diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/common/utils/TraceUtil.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/common/utils/TraceUtil.java new file mode 100644 index 000000000..86fd83f41 --- /dev/null +++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/common/utils/TraceUtil.java @@ -0,0 +1,24 @@ +package cn.axzo.workflow.core.common.utils; + +import org.slf4j.MDC; +import org.springframework.util.StringUtils; + +import static cn.axzo.workflow.common.constant.LogFieldConstants.X_REQUEST_ID; +import static cn.azxo.framework.common.constatns.Constants.CTX_LOG_ID_MDC; + +/** + * 获取 TraceId + * + * @author wangli + * @since 2024/7/3 10:14 + */ +public final class TraceUtil { + + private TraceUtil() { + } + + public static String traceId() { + String xRequestId = MDC.get(X_REQUEST_ID); + return StringUtils.hasText(xRequestId) ? xRequestId : MDC.get(CTX_LOG_ID_MDC); + } +} diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/conf/FlowableConfiguration.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/conf/FlowableConfiguration.java index 769d3651a..ed8ec8a02 100644 --- a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/conf/FlowableConfiguration.java +++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/conf/FlowableConfiguration.java @@ -3,7 +3,7 @@ package cn.axzo.workflow.core.conf; import cn.axzo.workflow.core.engine.behavior.CustomActivityBehaviorFactory; import cn.axzo.workflow.core.engine.cmd.CustomCommandContextFactory; import cn.axzo.workflow.core.engine.id.BasedNacosSnowflakeIdGenerator; -import cn.axzo.workflow.core.engine.interceptor.CustomLockProcessInstanceInterceptor; +import cn.axzo.workflow.core.engine.interceptor.CustomRetryInterceptor; import cn.axzo.workflow.core.engine.job.AsyncAbortProcessInstanceHandler; import cn.axzo.workflow.core.engine.job.AsyncApproveTaskJobHandler; import cn.axzo.workflow.core.engine.job.AsyncBpmnProcessActivityJobHandler; @@ -23,7 +23,6 @@ import com.alibaba.cloud.nacos.NacosServiceManager; import com.google.common.collect.Lists; import org.flowable.common.engine.api.delegate.event.FlowableEventListener; import org.flowable.common.engine.impl.history.HistoryLevel; -import org.flowable.common.engine.impl.interceptor.RetryInterceptor; import org.flowable.form.spring.SpringFormEngineConfiguration; import org.flowable.job.service.JobProcessor; import org.flowable.spring.SpringProcessEngineConfiguration; @@ -32,7 +31,6 @@ import org.springframework.beans.factory.ObjectProvider; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.core.StringRedisTemplate; import java.time.Duration; @@ -98,7 +96,7 @@ public class FlowableConfiguration { new CustomAsyncRunnableExceptionExceptionHandler())); configuration.setCommandContextFactory(new CustomCommandContextFactory()); configuration.setCustomPreCommandInterceptors(Lists.newArrayList( - new CustomLockProcessInstanceInterceptor() + new CustomRetryInterceptor() )); }; } diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/AbstractCommand.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/AbstractCommand.java index ed5aae60b..491c72cb8 100644 --- a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/AbstractCommand.java +++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/AbstractCommand.java @@ -1,12 +1,15 @@ package cn.axzo.workflow.core.engine.cmd; + +import org.flowable.common.engine.impl.interceptor.Command; + /** * TODO * * @author wangli * @since 2024/7/1 13:59 */ -public abstract class AbstractCommand { +public abstract class AbstractCommand implements Command { - public abstract String getProcessInstanceId(); + public abstract String paramToJsonString(); } diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomAbortProcessInstanceAsyncCmd.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomAbortProcessInstanceAsyncCmd.java index 4dbc65b81..ec87d66fa 100644 --- a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomAbortProcessInstanceAsyncCmd.java +++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomAbortProcessInstanceAsyncCmd.java @@ -4,7 +4,7 @@ import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceAbo import cn.axzo.workflow.core.common.exception.WorkflowEngineException; import cn.axzo.workflow.core.engine.job.AsyncAbortProcessInstanceHandler; import cn.hutool.json.JSONUtil; -import org.flowable.common.engine.impl.interceptor.Command; +import com.alibaba.fastjson.JSON; import org.flowable.common.engine.impl.interceptor.CommandContext; import org.flowable.engine.HistoryService; import org.flowable.engine.history.HistoricProcessInstance; @@ -23,7 +23,7 @@ import static cn.axzo.workflow.core.common.code.BpmnInstanceRespCode.PROCESS_INS import static cn.axzo.workflow.core.common.code.BpmnInstanceRespCode.PROCESS_INSTANCE_CANT_ABORT; import static cn.axzo.workflow.core.common.code.BpmnInstanceRespCode.PROCESS_INSTANCE_NOT_EXISTS; -public class CustomAbortProcessInstanceAsyncCmd implements Command, Serializable { +public class CustomAbortProcessInstanceAsyncCmd extends AbstractCommand implements Serializable { private final BpmnProcessInstanceAbortDTO dto; @@ -31,6 +31,11 @@ public class CustomAbortProcessInstanceAsyncCmd implements Command, Serial this.dto = dto; } + @Override + public String paramToJsonString() { + return JSON.toJSONString(dto); + } + @Override public Void execute(CommandContext commandContext) { String processInstanceId = dto.getProcessInstanceId(); @@ -80,4 +85,5 @@ public class CustomAbortProcessInstanceAsyncCmd implements Command, Serial jobService.createAsyncJob(job, false); jobService.scheduleAsyncJob(job); } + } diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomAbortProcessInstanceCmd.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomAbortProcessInstanceCmd.java index 0bd434a7a..91020386c 100644 --- a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomAbortProcessInstanceCmd.java +++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomAbortProcessInstanceCmd.java @@ -4,6 +4,8 @@ import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner; import cn.axzo.workflow.core.common.exception.WorkflowEngineException; import cn.axzo.workflow.core.engine.operation.DeleteProcessInstanceOperation; import cn.axzo.workflow.core.service.ExtAxHiTaskInstService; +import com.alibaba.fastjson.JSON; +import liquibase.pro.packaged.V; import org.flowable.common.engine.impl.interceptor.Command; import org.flowable.common.engine.impl.interceptor.CommandContext; import org.flowable.engine.HistoryService; @@ -44,7 +46,7 @@ import static cn.axzo.workflow.core.engine.cmd.helper.CustomTaskHelper.createVir * @author wangli * @since 2024/1/2 18:19 */ -public class CustomAbortProcessInstanceCmd extends AbstractCommand implements Command, Serializable { +public class CustomAbortProcessInstanceCmd extends AbstractCommand implements Serializable { private final String processInstanceId; private final String tenantId; private final String reason; @@ -58,6 +60,15 @@ public class CustomAbortProcessInstanceCmd extends AbstractCommand implements Co this.extAxHiTaskInstService = extAxHiTaskInstService; } + @Override + public String paramToJsonString() { + Map params = new HashMap<>(); + params.put("processInstanceId", processInstanceId); + params.put("tenantId", tenantId); + params.put("reason", reason); + return JSON.toJSONString(params); + } + @Override public Void execute(CommandContext commandContext) { ProcessEngineConfigurationImpl processEngineConfiguration = @@ -103,11 +114,4 @@ public class CustomAbortProcessInstanceCmd extends AbstractCommand implements Co return null; } - @Override - public String getProcessInstanceId() { - if (StringUtils.hasText(processInstanceId)) { - return processInstanceId; - } - return null; - } } diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomApproveTaskAsyncCmd.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomApproveTaskAsyncCmd.java index 0f5d57be6..8c23dc946 100644 --- a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomApproveTaskAsyncCmd.java +++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomApproveTaskAsyncCmd.java @@ -3,6 +3,7 @@ package cn.axzo.workflow.core.engine.cmd; import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskAuditDTO; import cn.axzo.workflow.core.engine.job.AsyncApproveTaskJobHandler; import cn.hutool.json.JSONUtil; +import com.alibaba.fastjson.JSON; import org.flowable.common.engine.impl.interceptor.Command; import org.flowable.common.engine.impl.interceptor.CommandContext; import org.flowable.engine.TaskService; @@ -18,6 +19,8 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.Serializable; +import java.util.HashMap; +import java.util.Map; import java.util.Objects; import static cn.axzo.workflow.core.engine.cmd.helper.CustomTaskHelper.validTask; @@ -28,7 +31,7 @@ import static cn.axzo.workflow.core.engine.cmd.helper.CustomTaskHelper.validTask * @author wangli * @since 2024/1/4 15:50 */ -public class CustomApproveTaskAsyncCmd implements Command, Serializable { +public class CustomApproveTaskAsyncCmd extends AbstractCommand implements Serializable { private static final Logger log = LoggerFactory.getLogger(CustomApproveTaskAsyncCmd.class); private final BpmnTaskAuditDTO dto; @@ -37,6 +40,11 @@ public class CustomApproveTaskAsyncCmd implements Command, Serializable { this.dto = dto; } + @Override + public String paramToJsonString() { + return JSON.toJSONString(dto); + } + @Override public Void execute(CommandContext commandContext) { ProcessEngineConfigurationImpl processEngineConfiguration = diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomApproveTaskCmd.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomApproveTaskCmd.java index f891b67a4..427be70d2 100644 --- a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomApproveTaskCmd.java +++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomApproveTaskCmd.java @@ -4,6 +4,7 @@ import cn.axzo.workflow.common.enums.BpmnFlowNodeType; import cn.axzo.workflow.common.model.request.bpmn.task.AttachmentDTO; import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskAuditDTO; import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner; +import com.alibaba.fastjson.JSON; import org.flowable.common.engine.impl.identity.Authentication; import org.flowable.common.engine.impl.interceptor.Command; import org.flowable.common.engine.impl.interceptor.CommandContext; @@ -21,7 +22,9 @@ import org.slf4j.LoggerFactory; import org.springframework.util.StringUtils; import java.io.Serializable; +import java.util.HashMap; import java.util.List; +import java.util.Map; import java.util.Objects; import static cn.axzo.workflow.common.constant.BpmnConstants.COMMENT_TYPE_ADVICE; @@ -39,7 +42,7 @@ import static cn.axzo.workflow.core.engine.cmd.helper.CustomTaskHelper.validTask * @author wangli * @since 2024/1/4 15:50 */ -public class CustomApproveTaskCmd extends AbstractCommand implements Command, Serializable { +public class CustomApproveTaskCmd extends AbstractCommand implements Serializable { private static final Logger log = LoggerFactory.getLogger(CustomApproveTaskCmd.class); private final String taskId; @@ -63,6 +66,18 @@ public class CustomApproveTaskCmd extends AbstractCommand implements Command nodeTypes; + @Override + public String paramToJsonString() { + Map params = new HashMap<>(); + params.put("taskId", taskId); + params.put("advice", advice); + params.put("operationDesc", operationDesc); + params.put("attachmentList", JSON.toJSONString(attachmentList)); + params.put("approver", JSON.toJSONString(approver)); + params.put("nextApprover", JSON.toJSONString(nextApprover)); + params.put("nodeTypes", JSON.toJSONString(nodeTypes)); + return JSON.toJSONString(params); + } public CustomApproveTaskCmd(BpmnTaskAuditDTO dto) { this(dto, null); @@ -147,17 +162,4 @@ public class CustomApproveTaskCmd extends AbstractCommand implements Command, Serializable { +public class CustomBizSpecifyAssigneeToTaskCmd extends AbstractCommand implements Serializable { private final String executionId; private final List addedAssigners; @@ -41,6 +44,14 @@ public class CustomBizSpecifyAssigneeToTaskCmd implements Command, Seri this.addedAssigners = addedAssigners; } + @Override + public String paramToJsonString() { + Map params = new HashMap<>(); + params.put("executionId", executionId); + params.put("addedAssigners", addedAssigners); + return JSON.toJSONString(params); + } + @Override public Boolean execute(CommandContext commandContext) { ProcessEngineConfigurationImpl processEngineConfiguration = diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomCancelProcessInstanceAsyncCmd.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomCancelProcessInstanceAsyncCmd.java index b99ec73f3..38e8174f8 100644 --- a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomCancelProcessInstanceAsyncCmd.java +++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomCancelProcessInstanceAsyncCmd.java @@ -5,7 +5,7 @@ import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner; import cn.axzo.workflow.core.common.exception.WorkflowEngineException; import cn.axzo.workflow.core.engine.job.AsyncCancelProcessInstanceHandler; import cn.hutool.json.JSONUtil; -import org.flowable.common.engine.impl.interceptor.Command; +import com.alibaba.fastjson.JSON; import org.flowable.common.engine.impl.interceptor.CommandContext; import org.flowable.engine.HistoryService; import org.flowable.engine.history.HistoricProcessInstance; @@ -23,7 +23,7 @@ import static cn.axzo.workflow.core.common.code.BpmnInstanceRespCode.PROCESS_INS import static cn.axzo.workflow.core.common.code.BpmnInstanceRespCode.PROCESS_INSTANCE_CANT_CANCEL; import static cn.axzo.workflow.core.common.code.BpmnInstanceRespCode.PROCESS_INSTANCE_NOT_EXISTS; -public class CustomCancelProcessInstanceAsyncCmd implements Command, Serializable { +public class CustomCancelProcessInstanceAsyncCmd extends AbstractCommand implements Serializable { private final BpmnProcessInstanceCancelDTO dto; @@ -31,6 +31,11 @@ public class CustomCancelProcessInstanceAsyncCmd implements Command, Seria this.dto = dto; } + @Override + public String paramToJsonString() { + return JSON.toJSONString(dto); + } + @Override public Void execute(CommandContext commandContext) { String processInstanceId = dto.getProcessInstanceId(), tenantId = dto.getTenantId(); @@ -81,4 +86,5 @@ public class CustomCancelProcessInstanceAsyncCmd implements Command, Seria jobService.createAsyncJob(job, false); jobService.scheduleAsyncJob(job); } + } diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomCancelProcessInstanceCmd.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomCancelProcessInstanceCmd.java index 540378165..500a3a83b 100644 --- a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomCancelProcessInstanceCmd.java +++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomCancelProcessInstanceCmd.java @@ -5,6 +5,7 @@ import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner; import cn.axzo.workflow.core.common.exception.WorkflowEngineException; import cn.axzo.workflow.core.engine.operation.DeleteProcessInstanceOperation; import cn.axzo.workflow.core.service.ExtAxHiTaskInstService; +import com.alibaba.fastjson.JSON; import org.flowable.common.engine.impl.interceptor.Command; import org.flowable.common.engine.impl.interceptor.CommandContext; import org.flowable.engine.HistoryService; @@ -43,7 +44,7 @@ import static cn.axzo.workflow.core.engine.cmd.helper.CustomTaskHelper.createVir * @author wangli * @since 2024/1/2 18:19 */ -public class CustomCancelProcessInstanceCmd extends AbstractCommand implements Command, Serializable { +public class CustomCancelProcessInstanceCmd extends AbstractCommand implements Serializable { private final String processInstanceId; private final String tenantId; private final String reason; @@ -60,6 +61,16 @@ public class CustomCancelProcessInstanceCmd extends AbstractCommand implements C this.extAxHiTaskInstService = extAxHiTaskInstService; } + @Override + public String paramToJsonString() { + Map params = new HashMap<>(); + params.put("processInstanceId", processInstanceId); + params.put("tenantId", tenantId); + params.put("reason", reason); + params.put("initiator", initiator); + return JSON.toJSONString(params); + } + @Override public Void execute(CommandContext commandContext) { ProcessEngineConfigurationImpl processEngineConfiguration = @@ -105,11 +116,4 @@ public class CustomCancelProcessInstanceCmd extends AbstractCommand implements C return null; } - @Override - public String getProcessInstanceId() { - if (StringUtils.hasText(processInstanceId)) { - return processInstanceId; - } - return null; - } } diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomCarbonCopyUserSelectorCmd.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomCarbonCopyUserSelectorCmd.java index 3e5f736f7..8e126d1a2 100644 --- a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomCarbonCopyUserSelectorCmd.java +++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomCarbonCopyUserSelectorCmd.java @@ -28,6 +28,7 @@ import org.springframework.util.CollectionUtils; import java.io.Serializable; import java.util.ArrayList; import java.util.Collections; +import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Objects; @@ -48,7 +49,7 @@ import static cn.axzo.workflow.core.engine.cmd.helper.CustomTaskHelper.removeDup * @since 18/03/2024 11:33 */ @Slf4j -public class CustomCarbonCopyUserSelectorCmd implements Command>, Serializable { +public class CustomCarbonCopyUserSelectorCmd extends AbstractCommand> implements Serializable { private static final long serialVersionUID = 1L; private final String processInstanceId; @@ -86,6 +87,15 @@ public class CustomCarbonCopyUserSelectorCmd implements Command params = new HashMap<>(); + params.put("processInstanceId", processInstanceId); + params.put("carbons", carbons); + params.put("serviceVersion", serviceVersion); + return JSON.toJSONString(params); + } + @Override public List execute(CommandContext commandContext) { if (CollectionUtils.isEmpty(carbons)) { @@ -224,5 +234,4 @@ public class CustomCarbonCopyUserSelectorCmd implements Command, Serializable { +public class CustomCommentTaskCmd extends AbstractCommand implements Serializable { private final String processInstanceId; private final BpmnTaskDelegateAssigner operator; private final String comment; @@ -63,6 +66,17 @@ public class CustomCommentTaskCmd implements Command, Serializable { this.extAxHiTaskInstService = extAxHiTaskInstService; } + @Override + public String paramToJsonString() { + Map params = new HashMap<>(); + params.put("processInstanceId", processInstanceId); + params.put("operator", operator); + params.put("comment", comment); + params.put("commentExt", commentExt); + params.put("attachmentList", attachmentList); + return JSON.toJSONString(params); + } + @Override public Void execute(CommandContext commandContext) { ProcessEngineConfigurationImpl processEngineConfiguration = diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomCompleteDummyTaskCmd.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomCompleteDummyTaskCmd.java index 6a9f920af..a00361cbf 100644 --- a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomCompleteDummyTaskCmd.java +++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomCompleteDummyTaskCmd.java @@ -5,6 +5,7 @@ import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner; import cn.axzo.workflow.core.common.exception.WorkflowEngineException; import cn.axzo.workflow.core.engine.cmd.helper.CustomTaskHelper; import cn.axzo.workflow.core.service.ExtAxHiTaskInstService; +import com.alibaba.fastjson.JSON; import org.flowable.common.engine.impl.identity.Authentication; import org.flowable.common.engine.impl.interceptor.Command; import org.flowable.common.engine.impl.interceptor.CommandContext; @@ -16,7 +17,9 @@ import org.springframework.util.CollectionUtils; import org.springframework.util.StringUtils; import java.io.Serializable; +import java.util.HashMap; import java.util.List; +import java.util.Map; import java.util.Objects; import static cn.axzo.workflow.common.constant.BpmnConstants.COMMENT_TYPE_OPERATION_DESC; @@ -30,7 +33,7 @@ import static cn.axzo.workflow.core.common.code.BpmnTaskRespCode.DUMMY_TASK_NOT_ * @author wangli * @since 2023/12/27 11:24 */ -public class CustomCompleteDummyTaskCmd implements Command, Serializable { +public class CustomCompleteDummyTaskCmd extends AbstractCommand implements Serializable { private final String processInstanceId; private final String taskId; private final String flowNodeName; @@ -46,6 +49,16 @@ public class CustomCompleteDummyTaskCmd implements Command, Serializable { this.extAxHiTaskInstService = extAxHiTaskInstService; } + @Override + public String paramToJsonString() { + Map params = new HashMap<>(); + params.put("processInstanceId", processInstanceId); + params.put("taskId", taskId); + params.put("flowNodeName", flowNodeName); + params.put("operationDesc", operationDesc); + return JSON.toJSONString(params); + } + @Override public Void execute(CommandContext commandContext) { ProcessEngineConfigurationImpl processEngineConfiguration = @@ -93,4 +106,5 @@ public class CustomCompleteDummyTaskCmd implements Command, Serializable { taskService.setOwner(i.getId(), null); }); } + } diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomCountersignUserTaskAsyncCmd.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomCountersignUserTaskAsyncCmd.java index 81956e9e7..f347c124d 100644 --- a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomCountersignUserTaskAsyncCmd.java +++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomCountersignUserTaskAsyncCmd.java @@ -3,6 +3,7 @@ package cn.axzo.workflow.core.engine.cmd; import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskCountersignDTO; import cn.axzo.workflow.core.engine.job.AsyncCountersignUserTaskJobHandler; import cn.hutool.json.JSONUtil; +import com.alibaba.fastjson.JSON; import org.flowable.common.engine.impl.interceptor.Command; import org.flowable.common.engine.impl.interceptor.CommandContext; import org.flowable.engine.TaskService; @@ -16,17 +17,24 @@ import org.flowable.task.api.history.HistoricTaskInstanceQuery; import org.flowable.task.service.impl.persistence.entity.TaskEntity; import java.io.Serializable; +import java.util.HashMap; +import java.util.Map; import static cn.axzo.workflow.core.engine.cmd.helper.CustomTaskHelper.validTask; import static cn.axzo.workflow.core.engine.cmd.helper.CustomTaskHelper.validTaskAssignerDuplicated; -public class CustomCountersignUserTaskAsyncCmd implements Command, Serializable { +public class CustomCountersignUserTaskAsyncCmd extends AbstractCommand implements Serializable { private final BpmnTaskCountersignDTO dto; public CustomCountersignUserTaskAsyncCmd(BpmnTaskCountersignDTO dto) { this.dto = dto; } + @Override + public String paramToJsonString() { + return JSON.toJSONString(dto); + } + @Override public Void execute(CommandContext commandContext) { ProcessEngineConfigurationImpl processEngineConfiguration = @@ -66,4 +74,5 @@ public class CustomCountersignUserTaskAsyncCmd implements Command, Seriali jobService.createAsyncJob(job, false); jobService.scheduleAsyncJob(job); } + } diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomCountersignUserTaskCmd.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomCountersignUserTaskCmd.java index 329b022cf..877cad88d 100644 --- a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomCountersignUserTaskCmd.java +++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomCountersignUserTaskCmd.java @@ -6,6 +6,7 @@ import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner; import cn.axzo.workflow.core.engine.cmd.helper.CustomTaskHelper; import cn.axzo.workflow.core.service.ExtAxHiTaskInstService; import cn.hutool.json.JSONUtil; +import com.alibaba.fastjson.JSON; import lombok.extern.slf4j.Slf4j; import org.flowable.common.engine.impl.interceptor.Command; import org.flowable.common.engine.impl.interceptor.CommandContext; @@ -19,7 +20,9 @@ import org.flowable.task.api.history.HistoricTaskInstanceQuery; import org.flowable.task.service.impl.persistence.entity.TaskEntity; import java.io.Serializable; +import java.util.HashMap; import java.util.List; +import java.util.Map; import static cn.axzo.workflow.common.constant.BpmnConstants.COMMENT_TYPE_OPERATION_DESC; import static cn.axzo.workflow.common.constant.BpmnConstants.INTERNAL_ACTIVITY_RELATION_ASSIGNEE_LIST_INFO_SNAPSHOT; @@ -39,7 +42,7 @@ import static cn.axzo.workflow.core.engine.cmd.helper.CustomTaskHelper.validTask * @since 2023/12/25 14:05 */ @Slf4j -public class CustomCountersignUserTaskCmd implements Command, Serializable { +public class CustomCountersignUserTaskCmd extends AbstractCommand implements Serializable { private final BpmnCountersignTypeEnum countersignType; private final String originTaskId; @@ -62,6 +65,18 @@ public class CustomCountersignUserTaskCmd implements Command, Serializable this.extAxHiTaskInstService = extAxHiTaskInstService; } + @Override + public String paramToJsonString() { + Map params = new HashMap<>(); + params.put("countersignType", countersignType.getType()); + params.put("originTaskId", originTaskId); + params.put("originTaskAssignee", originTaskAssignee); + params.put("advice", advice); + params.put("attachmentList", JSON.toJSONString(attachmentList)); + params.put("targetTaskAssigneeList", JSON.toJSONString(targetTaskAssigneeList)); + return JSON.toJSONString(params); + } + @Override public Void execute(CommandContext commandContext) { ProcessEngineConfigurationImpl processEngineConfiguration = @@ -139,4 +154,5 @@ public class CustomCountersignUserTaskCmd implements Command, Serializable addComment(commandContext, virtualTask, COMMENT_TYPE_OPERATION_DESC, message.toString()); batchAddAttachment(commandContext, task.getProcessInstanceId(), task.getId(), attachmentList, originTaskAssignee); } + } diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomCreateDummyTaskCmd.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomCreateDummyTaskCmd.java index ba6cda820..f1973b35b 100644 --- a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomCreateDummyTaskCmd.java +++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomCreateDummyTaskCmd.java @@ -5,6 +5,7 @@ import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner; import cn.axzo.workflow.core.common.exception.WorkflowEngineException; import cn.axzo.workflow.core.engine.cmd.helper.CustomTaskHelper; import cn.axzo.workflow.core.service.ExtAxHiTaskInstService; +import com.alibaba.fastjson.JSON; import org.flowable.common.engine.impl.cfg.IdGenerator; import org.flowable.common.engine.impl.identity.Authentication; import org.flowable.common.engine.impl.interceptor.Command; @@ -21,7 +22,9 @@ import org.springframework.util.CollectionUtils; import java.io.Serializable; import java.util.Date; +import java.util.HashMap; import java.util.List; +import java.util.Map; import java.util.Objects; import static cn.axzo.workflow.common.constant.BpmnConstants.COMMENT_TYPE_OPERATION_DESC; @@ -41,7 +44,7 @@ import static org.flowable.task.api.Task.DEFAULT_PRIORITY; * @author wangli * @since 2023/12/27 10:21 */ -public class CustomCreateDummyTaskCmd implements Command, Serializable { +public class CustomCreateDummyTaskCmd extends AbstractCommand implements Serializable { private final String processInstanceId; private final String flowNodeName; private final String operationDesc; @@ -57,6 +60,16 @@ public class CustomCreateDummyTaskCmd implements Command, Serializable { this.extAxHiTaskInstService = extAxHiTaskInstService; } + @Override + public String paramToJsonString() { + Map params = new HashMap<>(); + params.put("processInstanceId", processInstanceId); + params.put("flowNodeName", flowNodeName); + params.put("operationDesc", operationDesc); + params.put("operator", operator); + return JSON.toJSONString(params); + } + /** * 在同一个实例下,不允许创建多个执行中的虚拟任务节点 * @@ -139,4 +152,5 @@ public class CustomCreateDummyTaskCmd implements Command, Serializable { }); } } + } diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomForecastUserTaskAssigneeCmd.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomForecastUserTaskAssigneeCmd.java index bb6070b5c..a17379858 100644 --- a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomForecastUserTaskAssigneeCmd.java +++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomForecastUserTaskAssigneeCmd.java @@ -19,7 +19,9 @@ import org.springframework.util.CollectionUtils; import java.io.Serializable; import java.util.ArrayList; import java.util.Collections; +import java.util.HashMap; import java.util.List; +import java.util.Map; import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getApproverSpecify; @@ -30,7 +32,7 @@ import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getApprove * @since 2023/12/11 17:56 */ @Slf4j -public class CustomForecastUserTaskAssigneeCmd implements Command>, Serializable { +public class CustomForecastUserTaskAssigneeCmd extends AbstractCommand> implements Serializable { private final String processInstanceId; private final UserTask userTask; private final EngineExecutionStartListener engineExecutionStartListener; @@ -42,6 +44,13 @@ public class CustomForecastUserTaskAssigneeCmd implements Command params = new HashMap<>(); + params.put("processInstanceId", processInstanceId); + return JSON.toJSONString(params); + } + @Override public List execute(CommandContext commandContext) { ProcessEngineConfigurationImpl processEngineConfiguration = @@ -81,4 +90,5 @@ public class CustomForecastUserTaskAssigneeCmd implements Command>, Serializable { +public class CustomNoticeDestinationUserSelectorCmd extends AbstractCommand> implements Serializable { private static final long serialVersionUID = 1L; private final EngineExecutionStartListener engineExecutionStartListener; private final BpmnHistoricTaskInstanceConverter historicTaskInstanceConverter; @@ -63,6 +64,17 @@ public class CustomNoticeDestinationUserSelectorCmd implements Command params = new HashMap<>(); + params.put("serviceVersion", serviceVersion); + params.put("workspaceType", workspaceType); + params.put("noticeProperty", noticeProperty); + params.put("processInstanceId", processInstanceId); + params.put("initiator", initiator); + return JSON.toJSONString(params); + } + @Override public List execute(CommandContext commandContext) { if (!noticeProperty.getSendMessage()) { @@ -170,5 +182,4 @@ public class CustomNoticeDestinationUserSelectorCmd implements Command, Serializable { +public class CustomRejectionTaskAsyncCmd extends AbstractCommand implements Serializable { private final BpmnTaskAuditDTO dto; public CustomRejectionTaskAsyncCmd(BpmnTaskAuditDTO dto) { this.dto = dto; } + @Override + public String paramToJsonString() { + return JSON.toJSONString(dto); + } + @Override public Void execute(CommandContext commandContext) { ProcessEngineConfigurationImpl processEngineConfiguration = @@ -69,4 +75,5 @@ public class CustomRejectionTaskAsyncCmd implements Command, Serializable jobService.createAsyncJob(job, false); jobService.scheduleAsyncJob(job); } + } diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomRejectionTaskCmd.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomRejectionTaskCmd.java index 7b47c6c1d..610d2df65 100644 --- a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomRejectionTaskCmd.java +++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomRejectionTaskCmd.java @@ -6,7 +6,7 @@ import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskAuditDTO; import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner; import cn.axzo.workflow.core.engine.operation.DeleteProcessInstanceOperation; import cn.axzo.workflow.core.service.ExtAxHiTaskInstService; -import org.flowable.common.engine.impl.interceptor.Command; +import com.alibaba.fastjson.JSON; import org.flowable.common.engine.impl.interceptor.CommandContext; import org.flowable.engine.RuntimeService; import org.flowable.engine.TaskService; @@ -44,7 +44,7 @@ import static cn.axzo.workflow.core.engine.cmd.helper.CustomTaskHelper.validTask * @author wangli * @since 2024/1/4 13:36 */ -public class CustomRejectionTaskCmd extends AbstractCommand implements Command, Serializable { +public class CustomRejectionTaskCmd extends AbstractCommand implements Serializable { private final String taskId; private final String advice; @@ -62,6 +62,17 @@ public class CustomRejectionTaskCmd extends AbstractCommand implements Command params = new HashMap<>(); + params.put("taskId", taskId); + params.put("advice", advice); + params.put("attachmentList", attachmentList); + params.put("approver", approver); + params.put("nodeTypes", nodeTypes); + return JSON.toJSONString(params); + } + @Override public Void execute(CommandContext commandContext) { ProcessEngineConfigurationImpl processEngineConfiguration = @@ -102,17 +113,4 @@ public class CustomRejectionTaskCmd extends AbstractCommand implements Command, Serializable { +public class CustomTransferUserTaskAsyncCmd extends AbstractCommand implements Serializable { private final BpmnTaskTransferDTO dto; @@ -32,6 +34,11 @@ public class CustomTransferUserTaskAsyncCmd implements Command, Serializab this.dto = dto; } + @Override + public String paramToJsonString() { + return JSON.toJSONString(dto); + } + @Override public Void execute(CommandContext commandContext) { ProcessEngineConfigurationImpl processEngineConfiguration = CommandContextUtil.getProcessEngineConfiguration(commandContext); @@ -65,4 +72,5 @@ public class CustomTransferUserTaskAsyncCmd implements Command, Serializab jobService.createAsyncJob(job, false); jobService.scheduleAsyncJob(job); } + } diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomTransferUserTaskCmd.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomTransferUserTaskCmd.java index 18c558946..5cf121307 100644 --- a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomTransferUserTaskCmd.java +++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomTransferUserTaskCmd.java @@ -3,6 +3,7 @@ package cn.axzo.workflow.core.engine.cmd; import cn.axzo.workflow.common.model.request.bpmn.task.AttachmentDTO; import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner; import cn.axzo.workflow.core.common.exception.WorkflowEngineException; +import com.alibaba.fastjson.JSON; import com.google.common.collect.Lists; import org.flowable.common.engine.impl.identity.Authentication; import org.flowable.common.engine.impl.interceptor.Command; @@ -18,7 +19,9 @@ import org.flowable.task.service.impl.persistence.entity.TaskEntity; import org.springframework.util.StringUtils; import java.io.Serializable; +import java.util.HashMap; import java.util.List; +import java.util.Map; import java.util.Objects; import java.util.Optional; @@ -43,7 +46,7 @@ import static cn.axzo.workflow.core.engine.cmd.helper.CustomTaskHelper.validTask * @author wangli * @since 2023/12/22 10:22 */ -public class CustomTransferUserTaskCmd implements Command, Serializable { +public class CustomTransferUserTaskCmd extends AbstractCommand implements Serializable { private final String originTaskId; private final BpmnTaskDelegateAssigner originTaskAssignee; @@ -60,6 +63,16 @@ public class CustomTransferUserTaskCmd implements Command, Serializable { this.targetTaskAssignee = targetTaskAssignee; } + @Override + public String paramToJsonString() { + Map params = new HashMap<>(); + params.put("originTaskId", originTaskId); + params.put("originTaskAssignee", originTaskAssignee); + params.put("advice", advice); + params.put("attachmentList", attachmentList); + params.put("targetTaskAssignee", targetTaskAssignee); + return JSON.toJSONString(params); + } @Override public Void execute(CommandContext commandContext) { @@ -125,4 +138,5 @@ public class CustomTransferUserTaskCmd implements Command, Serializable { INTERNAL_ACTIVITY_RELATION_ASSIGNEE_LIST_INFO_SNAPSHOT + task.getTaskDefinitionKey(), originAssingeeList); } + } diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/interceptor/CustomLockProcessInstanceInterceptor.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/interceptor/CustomLockProcessInstanceInterceptor.java deleted file mode 100644 index f15ab3040..000000000 --- a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/interceptor/CustomLockProcessInstanceInterceptor.java +++ /dev/null @@ -1,82 +0,0 @@ -package cn.axzo.workflow.core.engine.interceptor; - -import lombok.extern.slf4j.Slf4j; -import org.apache.ibatis.exceptions.PersistenceException; -import org.flowable.common.engine.api.FlowableException; -import org.flowable.common.engine.impl.interceptor.AbstractCommandInterceptor; -import org.flowable.common.engine.impl.interceptor.Command; -import org.flowable.common.engine.impl.interceptor.CommandConfig; -import org.flowable.common.engine.impl.interceptor.CommandExecutor; - -/** - * 增加一个拦截器,用来控制多个操作,不允许同时操作同一个实例 - * - * @author wangli - * @since 2024/7/1 13:51 - */ -@Slf4j -public class CustomLockProcessInstanceInterceptor extends AbstractCommandInterceptor { - - protected int numOfRetries = 3; - protected int waitTimeInMs = 50; - protected int waitIncreaseFactor = 5; - - @Override - public T execute(CommandConfig config, Command command, CommandExecutor commandExecutor) { - long waitTime = waitTimeInMs; - int failedAttempts = 0; - - do { - if (failedAttempts > 0) { - log.warn("Waiting for {}ms before retrying the command.", waitTime); - waitBeforeRetry(waitTime); - waitTime *= waitIncreaseFactor; - } - - try { - - // try to execute the command - return next.execute(config, command, commandExecutor); - - } catch (PersistenceException e) { - log.error("Caught persistence exception: {}", e.getMessage(), e); - } - - failedAttempts++; - } while (failedAttempts <= numOfRetries); - - throw new FlowableException(numOfRetries + " retries failed with FlowableOptimisticLockingException. Giving up."); - } - - protected void waitBeforeRetry(long waitTime) { - try { - Thread.sleep(waitTime); - } catch (InterruptedException e) { - log.error("I am interrupted while waiting for a retry."); - } - } - - public void setNumOfRetries(int numOfRetries) { - this.numOfRetries = numOfRetries; - } - - public void setWaitIncreaseFactor(int waitIncreaseFactor) { - this.waitIncreaseFactor = waitIncreaseFactor; - } - - public void setWaitTimeInMs(int waitTimeInMs) { - this.waitTimeInMs = waitTimeInMs; - } - - public int getNumOfRetries() { - return numOfRetries; - } - - public int getWaitIncreaseFactor() { - return waitIncreaseFactor; - } - - public int getWaitTimeInMs() { - return waitTimeInMs; - } -} 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 new file mode 100644 index 000000000..62094a5c0 --- /dev/null +++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/interceptor/CustomRetryInterceptor.java @@ -0,0 +1,92 @@ +package cn.axzo.workflow.core.engine.interceptor; + +import cn.axzo.workflow.core.common.exception.WorkflowEngineException; +import cn.axzo.workflow.core.common.utils.TraceUtil; +import cn.axzo.workflow.core.engine.cmd.AbstractCommand; +import lombok.extern.slf4j.Slf4j; +import org.apache.ibatis.exceptions.PersistenceException; +import org.flowable.common.engine.impl.interceptor.AbstractCommandInterceptor; +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 static cn.axzo.workflow.core.common.code.FlowableEngineRespCode.ENGINE_ASYNC_COMMAND_EXECUTION_ERROR; +import static cn.axzo.workflow.core.common.code.FlowableEngineRespCode.ENGINE_ASYNC_COMMAND_EXECUTION_RETRY_GIVE_UP; + +/** + * 基于 RetryInterceptor 的命令重试拦截器, 本意想用来处理多人同时操作同一个任务, 但会存在超过重试次数后,会丢弃原有的命令. + * + * @author wangli + * @since 2024/7/1 13:51 + */ +@Slf4j +public class CustomRetryInterceptor extends AbstractCommandInterceptor { + + protected int numOfRetries = 3; + protected int waitTimeInMs = 60; + protected int waitIncreaseFactor = 5; + + @Override + public T execute(CommandConfig config, Command command, CommandExecutor commandExecutor) { + try { + long waitTime = waitTimeInMs; + int failedAttempts = 0; + do { + if (failedAttempts > 0) { + log.warn("Waiting for {}ms before retrying the command.", waitTime); + waitBeforeRetry(waitTime); + waitTime *= waitIncreaseFactor; + } + + try { + // try to execute the command + if (AbstractCommand.class.isAssignableFrom(command.getClass())) { + log.info("traceId:{} Executing command params: {}", TraceUtil.traceId(), + ((AbstractCommand) command).paramToJsonString()); + } + return next.execute(config, command, commandExecutor); + + } catch (PersistenceException e) { + log.warn("Caught persistence exception: {}", e.getMessage(), e); + } + + failedAttempts++; + } while (failedAttempts <= numOfRetries); + throw new WorkflowEngineException(ENGINE_ASYNC_COMMAND_EXECUTION_RETRY_GIVE_UP, String.valueOf(numOfRetries)); + } catch (Throwable e) { + throw new WorkflowEngineException(ENGINE_ASYNC_COMMAND_EXECUTION_ERROR, e.getMessage()); + } + } + + protected void waitBeforeRetry(long waitTime) { + try { + Thread.sleep(waitTime); + } catch (InterruptedException e) { + log.warn("I am interrupted while waiting for a retry."); + } + } + + public void setNumOfRetries(int numOfRetries) { + this.numOfRetries = numOfRetries; + } + + public void setWaitIncreaseFactor(int waitIncreaseFactor) { + this.waitIncreaseFactor = waitIncreaseFactor; + } + + public void setWaitTimeInMs(int waitTimeInMs) { + this.waitTimeInMs = waitTimeInMs; + } + + public int getNumOfRetries() { + return numOfRetries; + } + + public int getWaitIncreaseFactor() { + return waitIncreaseFactor; + } + + public int getWaitTimeInMs() { + return waitTimeInMs; + } +} diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/service/support/ExpressionConditionCmd.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/service/support/ExpressionConditionCmd.java index 672db4e0a..54c7080b3 100644 --- a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/service/support/ExpressionConditionCmd.java +++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/service/support/ExpressionConditionCmd.java @@ -1,7 +1,9 @@ package cn.axzo.workflow.core.service.support; import cn.axzo.workflow.core.common.exception.WorkflowEngineException; +import cn.axzo.workflow.core.engine.cmd.AbstractCommand; import cn.azxo.framework.common.utils.StringUtils; +import com.alibaba.fastjson.JSON; import org.flowable.common.engine.api.delegate.Expression; import org.flowable.common.engine.impl.interceptor.Command; import org.flowable.common.engine.impl.interceptor.CommandContext; @@ -10,6 +12,8 @@ import org.flowable.engine.impl.cfg.ProcessEngineConfigurationImpl; import org.flowable.engine.impl.persistence.entity.ExecutionEntity; import java.io.Serializable; +import java.util.HashMap; +import java.util.Map; import static cn.axzo.workflow.core.common.code.FlowableEngineRespCode.ENGINE_EXECUTION_LOST_ID_ERROR; @@ -20,7 +24,7 @@ import static cn.axzo.workflow.core.common.code.FlowableEngineRespCode.ENGINE_EX * @author wangli * @since 2023/10/9 19:30 */ -public class ExpressionConditionCmd implements Command, Serializable { +public class ExpressionConditionCmd extends AbstractCommand implements Serializable { protected final RuntimeService runtimeService; protected final ProcessEngineConfigurationImpl processEngineConfiguration; protected final String processInstanceId; @@ -35,6 +39,14 @@ public class ExpressionConditionCmd implements Command, Serializable { this.exp = exp; } + @Override + public String paramToJsonString() { + Map params = new HashMap<>(); + params.put("processInstanceId", processInstanceId); + params.put("exp", exp); + return JSON.toJSONString(params); + } + @Override public Boolean execute(CommandContext commandContext) { Expression expression = processEngineConfiguration.getExpressionManager().createExpression(this.exp); diff --git a/workflow-engine-core/src/main/java/org/flowable/engine/impl/cmd/CreateAttachmentCmd.java b/workflow-engine-core/src/main/java/org/flowable/engine/impl/cmd/CreateAttachmentCmd.java index aa30f0396..9f0f63f53 100644 --- a/workflow-engine-core/src/main/java/org/flowable/engine/impl/cmd/CreateAttachmentCmd.java +++ b/workflow-engine-core/src/main/java/org/flowable/engine/impl/cmd/CreateAttachmentCmd.java @@ -1,5 +1,8 @@ package org.flowable.engine.impl.cmd; +import cn.axzo.workflow.core.engine.cmd.AbstractCommand; +import com.alibaba.fastjson.JSON; +import liquibase.pro.packaged.M; import org.flowable.common.engine.api.FlowableException; import org.flowable.common.engine.api.FlowableObjectNotFoundException; import org.flowable.common.engine.api.delegate.event.FlowableEngineEventType; @@ -22,6 +25,9 @@ import org.flowable.task.api.Task; import org.flowable.task.service.impl.persistence.entity.TaskEntity; import java.io.InputStream; +import java.io.Serializable; +import java.util.HashMap; +import java.util.Map; /** * 覆盖 Flowable 自带的 CreateAttachmentCmd, 由于 Flowable 5 的实现导致异常,需要覆盖 @@ -29,7 +35,7 @@ import java.io.InputStream; * @author Tom Baeyens * @author Joram Barrez */ -public class CreateAttachmentCmd implements Command { +public class CreateAttachmentCmd extends AbstractCommand implements Serializable { protected String attachmentType; protected String taskId; @@ -50,6 +56,19 @@ public class CreateAttachmentCmd implements Command { this.url = url; } + @Override + public String paramToJsonString() { + Map params = new HashMap<>(); + params.put("attachmentType", attachmentType); + params.put("taskId", taskId); + params.put("processInstanceId", processInstanceId); + params.put("attachmentName", attachmentName); + params.put("attachmentDescription", attachmentDescription); +// params.put("content", content); + params.put("url", url); + return JSON.toJSONString(params); + } + @Override public Attachment execute(CommandContext commandContext) { diff --git a/workflow-engine-server/pom.xml b/workflow-engine-server/pom.xml index 279ccf123..80e18794a 100644 --- a/workflow-engine-server/pom.xml +++ b/workflow-engine-server/pom.xml @@ -95,10 +95,10 @@ cn.axzo.maokai maokai-api - - cn.axzo.tyr - tyr-api - + + + + cn.axzo.karma karma-api diff --git a/workflow-engine-server/src/main/java/cn/axzo/workflow/server/common/filter/HttpTraceLogFilter.java b/workflow-engine-server/src/main/java/cn/axzo/workflow/server/common/filter/HttpTraceLogFilter.java index 1af797b06..ac540b2b4 100644 --- a/workflow-engine-server/src/main/java/cn/axzo/workflow/server/common/filter/HttpTraceLogFilter.java +++ b/workflow-engine-server/src/main/java/cn/axzo/workflow/server/common/filter/HttpTraceLogFilter.java @@ -9,6 +9,7 @@ import org.apache.skywalking.apm.toolkit.trace.TraceContext; import org.slf4j.MDC; import org.springframework.core.Ordered; import org.springframework.stereotype.Component; +import org.springframework.util.StringUtils; import org.springframework.web.filter.OncePerRequestFilter; import javax.servlet.FilterChain; @@ -18,6 +19,7 @@ import javax.servlet.http.HttpServletResponse; import java.io.IOException; import static cn.axzo.workflow.common.constant.LogFieldConstants.X_REQUEST_ID; +import static cn.azxo.framework.common.constatns.Constants.CTX_LOG_ID_MDC; /** * Http接口日志记录 @@ -44,18 +46,18 @@ public class HttpTraceLogFilter extends OncePerRequestFilter implements Ordered } else { MDC.put(X_REQUEST_ID, requestId); } - String ctxLogId = request.getHeader(Constants.CTX_LOG_ID_MDC); + String ctxLogId = request.getHeader(CTX_LOG_ID_MDC); if (Strings.isNullOrEmpty(ctxLogId)) { - MDC.put(Constants.CTX_LOG_ID_MDC, getTraceId()); + MDC.put(CTX_LOG_ID_MDC, getTraceId()); } else { - MDC.put(Constants.CTX_LOG_ID_MDC, ctxLogId); + MDC.put(CTX_LOG_ID_MDC, ctxLogId); } try { filterChain.doFilter(request, response); } finally { - response.setHeader(Constants.CTX_LOG_ID_MDC, MDC.get(Constants.CTX_LOG_ID_MDC)); - response.setHeader(X_REQUEST_ID, MDC.get(Constants.CTX_LOG_ID_MDC)); + response.setHeader(CTX_LOG_ID_MDC, MDC.get(CTX_LOG_ID_MDC)); + response.setHeader(X_REQUEST_ID, MDC.get(CTX_LOG_ID_MDC)); MDC.clear(); } } @@ -64,4 +66,10 @@ public class HttpTraceLogFilter extends OncePerRequestFilter implements Ordered String contextTraceId = TraceContext.traceId(); return Strings.isNullOrEmpty(contextTraceId) ? IdUtil.fastSimpleUUID() : contextTraceId; } + + public static String traceId() { + String xRequestId = MDC.get(X_REQUEST_ID); + return StringUtils.hasText(xRequestId) ? xRequestId : MDC.get(CTX_LOG_ID_MDC); + + } }