From 05d555d789889d5b3461485d47f24cfbda216ddf Mon Sep 17 00:00:00 2001 From: wangli <274027703@qq.com> Date: Wed, 22 Jan 2025 10:39:34 +0800 Subject: [PATCH 01/10] =?UTF-8?q?feat(REQ-3340)=20-=20starter=20=E6=9B=B4?= =?UTF-8?q?=E6=96=B0=20API=20=E5=A6=82=E6=9E=9C=E5=AD=98=E5=9C=A8=E7=9B=B8?= =?UTF-8?q?=E5=90=8C=E6=96=B9=E6=B3=95=E5=90=8D=E5=90=8C=E5=BC=82=E6=AD=A5?= =?UTF-8?q?=E7=9A=84=E5=A4=84=E7=90=86=E5=8A=9E=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit (cherry picked from commit 4d39265ecd1bc5b558a86689e820a52d4aaa1b7a) --- .../mq/WorkflowEngineStarterRpcInvokeDTO.java | 10 +++++++++ .../feign/ext/ComplexInvokeClient.java | 6 +++++ ...rkflowEngineStarterRetryEventListener.java | 22 +++++++++++++++---- 3 files changed, 34 insertions(+), 4 deletions(-) diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/response/mq/WorkflowEngineStarterRpcInvokeDTO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/response/mq/WorkflowEngineStarterRpcInvokeDTO.java index d01e38598..de160efff 100644 --- a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/response/mq/WorkflowEngineStarterRpcInvokeDTO.java +++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/response/mq/WorkflowEngineStarterRpcInvokeDTO.java @@ -18,6 +18,8 @@ public class WorkflowEngineStarterRpcInvokeDTO implements Serializable { private List parameters; + private String parameterTypesMd5; + public String getClassName() { return className; } @@ -41,4 +43,12 @@ public class WorkflowEngineStarterRpcInvokeDTO implements Serializable { public void setParameters(List parameters) { this.parameters = parameters; } + + public String getParameterTypesMd5() { + return parameterTypesMd5; + } + + public void setParameterTypesMd5(String parameterTypesMd5) { + this.parameterTypesMd5 = parameterTypesMd5; + } } diff --git a/workflow-engine-spring-boot-starter/src/main/java/cn/axzo/workflow/starter/feign/ext/ComplexInvokeClient.java b/workflow-engine-spring-boot-starter/src/main/java/cn/axzo/workflow/starter/feign/ext/ComplexInvokeClient.java index 81e7c81d2..69c01652a 100644 --- a/workflow-engine-spring-boot-starter/src/main/java/cn/axzo/workflow/starter/feign/ext/ComplexInvokeClient.java +++ b/workflow-engine-spring-boot-starter/src/main/java/cn/axzo/workflow/starter/feign/ext/ComplexInvokeClient.java @@ -18,6 +18,7 @@ import org.springframework.beans.BeansException; import org.springframework.beans.factory.BeanFactory; import org.springframework.http.HttpStatus; import org.springframework.util.CollectionUtils; +import org.springframework.util.StringUtils; import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; @@ -36,6 +37,7 @@ import java.lang.reflect.Method; import java.lang.reflect.Parameter; import java.nio.charset.Charset; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.HashMap; @@ -46,6 +48,7 @@ import java.util.Objects; import java.util.Queue; import java.util.regex.Matcher; import java.util.regex.Pattern; +import java.util.stream.Collectors; import static cn.axzo.workflow.common.constant.StarterConstants.STARTER_INVOKE_MODE; import static cn.axzo.workflow.common.enums.RpcInvokeModeEnum.SYNC; @@ -102,6 +105,9 @@ public class ComplexInvokeClient implements Client { event.setClassName(metadata.targetType().getName()); event.setMethodName(metadata.method().getName()); + Class[] parameterTypes = metadata.method().getParameterTypes(); + event.setParameterTypesMd5(StringUtils.collectionToCommaDelimitedString(Arrays.stream(parameterTypes).map(Class::getName).collect(Collectors.toList()))); + List args = new ArrayList<>(); event.setParameters(args); buildArgs(request, metadata, args); diff --git a/workflow-engine-spring-boot-starter/src/main/java/cn/axzo/workflow/starter/mq/retry/consumer/WorkflowEngineStarterRetryEventListener.java b/workflow-engine-spring-boot-starter/src/main/java/cn/axzo/workflow/starter/mq/retry/consumer/WorkflowEngineStarterRetryEventListener.java index 0b847c0d0..9461ab1aa 100644 --- a/workflow-engine-spring-boot-starter/src/main/java/cn/axzo/workflow/starter/mq/retry/consumer/WorkflowEngineStarterRetryEventListener.java +++ b/workflow-engine-spring-boot-starter/src/main/java/cn/axzo/workflow/starter/mq/retry/consumer/WorkflowEngineStarterRetryEventListener.java @@ -20,6 +20,7 @@ import org.springframework.cloud.openfeign.FeignClient; import org.springframework.core.annotation.AnnotationUtils; import org.springframework.core.env.Environment; import org.springframework.util.CollectionUtils; +import org.springframework.util.StringUtils; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestParam; @@ -27,10 +28,12 @@ import org.springframework.web.bind.annotation.RequestParam; import java.lang.annotation.Annotation; import java.lang.reflect.Method; import java.net.ConnectException; +import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Objects; +import java.util.stream.Collectors; import static cn.axzo.workflow.common.enums.RpcInvokeModeEnum.SYNC; @@ -48,7 +51,7 @@ public class WorkflowEngineStarterRetryEventListener implements EventHandler, In private final String currentApplicationName; private WorkflowCoreService workflowCoreService; private WorkflowManageService workflowManageService; - private final Map methodCache = new HashMap<>(); + private final Map> multiMethodCache = new HashMap<>(); class InterfaceMapping { private final Object interfaceObject; @@ -97,7 +100,10 @@ public class WorkflowEngineStarterRetryEventListener implements EventHandler, In Method[] methods = coreService.getDeclaredMethods(); for (Method method : methods) { - methodCache.put(method.getName(), new InterfaceMapping(workflowCoreService, method)); + String parameterStr = StringUtils.collectionToCommaDelimitedString(Arrays.stream(method.getParameterTypes()).map(Class::getName).collect(Collectors.toList())); + Map methodCache = multiMethodCache.getOrDefault(parameterStr, new HashMap<>()); + methodCache.put(parameterStr, new InterfaceMapping(workflowCoreService, method)); + multiMethodCache.put(method.getName(), methodCache); } } @@ -110,7 +116,10 @@ public class WorkflowEngineStarterRetryEventListener implements EventHandler, In Method[] methods = manageService.getDeclaredMethods(); for (Method method : methods) { - methodCache.put(method.getName(), new InterfaceMapping(workflowManageService, method)); + String parameterStr = StringUtils.collectionToCommaDelimitedString(Arrays.stream(method.getParameterTypes()).map(Class::getName).collect(Collectors.toList())); + Map methodCache = multiMethodCache.getOrDefault(parameterStr, new HashMap<>()); + methodCache.put(parameterStr, new InterfaceMapping(workflowManageService, method)); + multiMethodCache.put(method.getName(), methodCache); } } @@ -120,7 +129,11 @@ public class WorkflowEngineStarterRetryEventListener implements EventHandler, In log.info("WorkflowEngineClientRetryEventListener onEvent: {}", event.toPrettyJsonString()); WorkflowEngineStarterRpcInvokeDTO dto = event.normalizedData(WorkflowEngineStarterRpcInvokeDTO.class); - InterfaceMapping mapping = methodCache.getOrDefault(dto.getMethodName(), null); + Map methodCache = multiMethodCache.getOrDefault(dto.getMethodName(), new HashMap<>()); + if (CollectionUtils.isEmpty(methodCache)) { + throw new WorkflowNoMethodException("Not methodCache found: " + dto.getMethodName()); + } + InterfaceMapping mapping = methodCache.getOrDefault(dto.getParameterTypesMd5(), null); if (Objects.isNull(mapping)) { throw new WorkflowNoMethodException("Not method found: " + dto.getMethodName()); } @@ -135,6 +148,7 @@ public class WorkflowEngineStarterRetryEventListener implements EventHandler, In if (log.isDebugEnabled()) { log.debug("Event Invoke Result: {}", JSON.toJSONString(invoke)); } + log.info("WorkflowEngineClientRetryEventListener onEvent end!"); } catch (Throwable e) { // 能抛出异常目前只有两种情况, 一个是网络异常, 另一个是对端服务内部异常 Throwable cause = getRealCause(e); From a41c6a950b258ff5f2bc7725fb2428795f85ab17 Mon Sep 17 00:00:00 2001 From: wangli <274027703@qq.com> Date: Wed, 5 Mar 2025 15:46:01 +0800 Subject: [PATCH 02/10] fix - starter same method name invoke error --- .../WorkflowEngineStarterMQMonitorController.java | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/workflow-engine-spring-boot-starter/src/main/java/cn/axzo/workflow/starter/mq/monitor/console/WorkflowEngineStarterMQMonitorController.java b/workflow-engine-spring-boot-starter/src/main/java/cn/axzo/workflow/starter/mq/monitor/console/WorkflowEngineStarterMQMonitorController.java index 2d4bf6dff..b10dd94b7 100644 --- a/workflow-engine-spring-boot-starter/src/main/java/cn/axzo/workflow/starter/mq/monitor/console/WorkflowEngineStarterMQMonitorController.java +++ b/workflow-engine-spring-boot-starter/src/main/java/cn/axzo/workflow/starter/mq/monitor/console/WorkflowEngineStarterMQMonitorController.java @@ -11,6 +11,7 @@ import org.apache.rocketmq.tools.admin.DefaultMQAdminExt; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.ObjectProvider; +import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.beans.factory.annotation.Value; import org.springframework.core.env.Environment; import org.springframework.web.bind.annotation.GetMapping; @@ -53,6 +54,9 @@ public class WorkflowEngineStarterMQMonitorController { private String applicationName; @Value("${spring.profiles.active}") private String activeProfile; + @Resource + @Qualifier("serviceVersion") + private String serviceVersion; public static String BROADCAST_CONSUMER_GROUP = "GID_%s_workflow_engine_%s_consumer"; public static String RPC_RETRY_CONSUMER_GROUP = "GID_%s_workflow_engine_starter_%s_consumer"; @@ -144,4 +148,9 @@ public class WorkflowEngineStarterMQMonitorController { return CommonResponse.success("以关闭 DLQ 钉钉通知"); } } + + @GetMapping("/v") + public CommonResponse consoleVersion() { + return CommonResponse.success("当前 workflow-engine version: " + serviceVersion + ",\r\nfix: cn.axzo.workflow.starter.mq.retry.consumer.WorkflowEngineStarterRetryEventListener.multiMethodCache"); + } } From 00b02f7c6485c1b60fda759f4c427d52a14c77b2 Mon Sep 17 00:00:00 2001 From: wangli <274027703@qq.com> Date: Wed, 5 Mar 2025 15:55:27 +0800 Subject: [PATCH 03/10] fix - starter same method name invoke error --- .../console/WorkflowEngineStarterMQMonitorController.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/workflow-engine-spring-boot-starter/src/main/java/cn/axzo/workflow/starter/mq/monitor/console/WorkflowEngineStarterMQMonitorController.java b/workflow-engine-spring-boot-starter/src/main/java/cn/axzo/workflow/starter/mq/monitor/console/WorkflowEngineStarterMQMonitorController.java index b10dd94b7..d3cc2d7b0 100644 --- a/workflow-engine-spring-boot-starter/src/main/java/cn/axzo/workflow/starter/mq/monitor/console/WorkflowEngineStarterMQMonitorController.java +++ b/workflow-engine-spring-boot-starter/src/main/java/cn/axzo/workflow/starter/mq/monitor/console/WorkflowEngineStarterMQMonitorController.java @@ -150,7 +150,11 @@ public class WorkflowEngineStarterMQMonitorController { } @GetMapping("/v") - public CommonResponse consoleVersion() { - return CommonResponse.success("当前 workflow-engine version: " + serviceVersion + ",\r\nfix: cn.axzo.workflow.starter.mq.retry.consumer.WorkflowEngineStarterRetryEventListener.multiMethodCache"); + public CommonResponse consoleVersion(@RequestParam("fix") Boolean showLastFix) { + String str = "当前 workflow-engine version: " + serviceVersion; + if (showLastFix) { + str += "fix: cn.axzo.workflow.starter.mq.retry.consumer.WorkflowEngineStarterRetryEventListener.multiMethodCache"; + } + return CommonResponse.success(str); } } From 120d84819ad0a7d65f895ba5e2882750f5cd74bb Mon Sep 17 00:00:00 2001 From: wangli <274027703@qq.com> Date: Wed, 5 Mar 2025 16:00:49 +0800 Subject: [PATCH 04/10] fix - starter same method name invoke error --- .../console/WorkflowEngineStarterMQMonitorController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/workflow-engine-spring-boot-starter/src/main/java/cn/axzo/workflow/starter/mq/monitor/console/WorkflowEngineStarterMQMonitorController.java b/workflow-engine-spring-boot-starter/src/main/java/cn/axzo/workflow/starter/mq/monitor/console/WorkflowEngineStarterMQMonitorController.java index d3cc2d7b0..633a0532a 100644 --- a/workflow-engine-spring-boot-starter/src/main/java/cn/axzo/workflow/starter/mq/monitor/console/WorkflowEngineStarterMQMonitorController.java +++ b/workflow-engine-spring-boot-starter/src/main/java/cn/axzo/workflow/starter/mq/monitor/console/WorkflowEngineStarterMQMonitorController.java @@ -150,7 +150,7 @@ public class WorkflowEngineStarterMQMonitorController { } @GetMapping("/v") - public CommonResponse consoleVersion(@RequestParam("fix") Boolean showLastFix) { + public CommonResponse consoleVersion(@RequestParam(value = "fix", required = false) Boolean showLastFix) { String str = "当前 workflow-engine version: " + serviceVersion; if (showLastFix) { str += "fix: cn.axzo.workflow.starter.mq.retry.consumer.WorkflowEngineStarterRetryEventListener.multiMethodCache"; From 6d2c895e85825bf45807724411fece9d2f32d3c1 Mon Sep 17 00:00:00 2001 From: wangli <274027703@qq.com> Date: Wed, 5 Mar 2025 16:05:50 +0800 Subject: [PATCH 05/10] fix - starter same method name invoke error --- .../console/WorkflowEngineStarterMQMonitorController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/workflow-engine-spring-boot-starter/src/main/java/cn/axzo/workflow/starter/mq/monitor/console/WorkflowEngineStarterMQMonitorController.java b/workflow-engine-spring-boot-starter/src/main/java/cn/axzo/workflow/starter/mq/monitor/console/WorkflowEngineStarterMQMonitorController.java index 633a0532a..eeb98074c 100644 --- a/workflow-engine-spring-boot-starter/src/main/java/cn/axzo/workflow/starter/mq/monitor/console/WorkflowEngineStarterMQMonitorController.java +++ b/workflow-engine-spring-boot-starter/src/main/java/cn/axzo/workflow/starter/mq/monitor/console/WorkflowEngineStarterMQMonitorController.java @@ -150,7 +150,7 @@ public class WorkflowEngineStarterMQMonitorController { } @GetMapping("/v") - public CommonResponse consoleVersion(@RequestParam(value = "fix", required = false) Boolean showLastFix) { + public CommonResponse consoleVersion(@RequestParam(value = "fix", required = false, defaultValue = "false") Boolean showLastFix) { String str = "当前 workflow-engine version: " + serviceVersion; if (showLastFix) { str += "fix: cn.axzo.workflow.starter.mq.retry.consumer.WorkflowEngineStarterRetryEventListener.multiMethodCache"; From 77d5011781bf35cc3d4835858a66b7da655ee3b7 Mon Sep 17 00:00:00 2001 From: wangli <274027703@qq.com> Date: Wed, 5 Mar 2025 15:55:27 +0800 Subject: [PATCH 06/10] fix - starter same method name invoke error --- .../feign/ext/ComplexInvokeClient.java | 3 +- ...rkflowEngineStarterRetryEventListener.java | 13 +++--- .../cn/axzo/workflow/starter/util/MD5.java | 46 +++++++++++++++++++ 3 files changed, 55 insertions(+), 7 deletions(-) create mode 100644 workflow-engine-spring-boot-starter/src/main/java/cn/axzo/workflow/starter/util/MD5.java diff --git a/workflow-engine-spring-boot-starter/src/main/java/cn/axzo/workflow/starter/feign/ext/ComplexInvokeClient.java b/workflow-engine-spring-boot-starter/src/main/java/cn/axzo/workflow/starter/feign/ext/ComplexInvokeClient.java index 69c01652a..6c6b5bc2f 100644 --- a/workflow-engine-spring-boot-starter/src/main/java/cn/axzo/workflow/starter/feign/ext/ComplexInvokeClient.java +++ b/workflow-engine-spring-boot-starter/src/main/java/cn/axzo/workflow/starter/feign/ext/ComplexInvokeClient.java @@ -5,6 +5,7 @@ import cn.axzo.workflow.common.model.response.mq.WorkflowEngineStarterRpcInvokeD import cn.axzo.workflow.starter.WorkflowEngineStarterProperties; import cn.axzo.workflow.starter.common.exception.WorkflowEngineStarterException; import cn.axzo.workflow.starter.mq.retry.producer.RpcInvokeEventProducer; +import cn.axzo.workflow.starter.util.MD5; import cn.azxo.framework.common.model.CommonResponse; import com.alibaba.fastjson.JSON; import feign.Client; @@ -106,7 +107,7 @@ public class ComplexInvokeClient implements Client { event.setMethodName(metadata.method().getName()); Class[] parameterTypes = metadata.method().getParameterTypes(); - event.setParameterTypesMd5(StringUtils.collectionToCommaDelimitedString(Arrays.stream(parameterTypes).map(Class::getName).collect(Collectors.toList()))); + event.setParameterTypesMd5(MD5.encrypt(StringUtils.collectionToCommaDelimitedString(Arrays.stream(parameterTypes).map(Class::getName).collect(Collectors.toList())))); List args = new ArrayList<>(); event.setParameters(args); diff --git a/workflow-engine-spring-boot-starter/src/main/java/cn/axzo/workflow/starter/mq/retry/consumer/WorkflowEngineStarterRetryEventListener.java b/workflow-engine-spring-boot-starter/src/main/java/cn/axzo/workflow/starter/mq/retry/consumer/WorkflowEngineStarterRetryEventListener.java index 9461ab1aa..22daebf03 100644 --- a/workflow-engine-spring-boot-starter/src/main/java/cn/axzo/workflow/starter/mq/retry/consumer/WorkflowEngineStarterRetryEventListener.java +++ b/workflow-engine-spring-boot-starter/src/main/java/cn/axzo/workflow/starter/mq/retry/consumer/WorkflowEngineStarterRetryEventListener.java @@ -10,6 +10,7 @@ import cn.axzo.workflow.starter.WorkflowEngineStarterProperties; import cn.axzo.workflow.starter.api.WorkflowCoreService; import cn.axzo.workflow.starter.api.WorkflowManageService; import cn.axzo.workflow.starter.common.exception.WorkflowNoMethodException; +import cn.axzo.workflow.starter.util.MD5; import com.alibaba.fastjson.JSON; import lombok.SneakyThrows; import org.slf4j.Logger; @@ -100,9 +101,9 @@ public class WorkflowEngineStarterRetryEventListener implements EventHandler, In Method[] methods = coreService.getDeclaredMethods(); for (Method method : methods) { - String parameterStr = StringUtils.collectionToCommaDelimitedString(Arrays.stream(method.getParameterTypes()).map(Class::getName).collect(Collectors.toList())); - Map methodCache = multiMethodCache.getOrDefault(parameterStr, new HashMap<>()); - methodCache.put(parameterStr, new InterfaceMapping(workflowCoreService, method)); + String parameterTypesMd5 = MD5.encrypt(StringUtils.collectionToCommaDelimitedString(Arrays.stream(method.getParameterTypes()).map(Class::getName).collect(Collectors.toList()))); + Map methodCache = multiMethodCache.getOrDefault(method.getName(), new HashMap<>()); + methodCache.put(parameterTypesMd5, new InterfaceMapping(workflowCoreService, method)); multiMethodCache.put(method.getName(), methodCache); } } @@ -116,9 +117,9 @@ public class WorkflowEngineStarterRetryEventListener implements EventHandler, In Method[] methods = manageService.getDeclaredMethods(); for (Method method : methods) { - String parameterStr = StringUtils.collectionToCommaDelimitedString(Arrays.stream(method.getParameterTypes()).map(Class::getName).collect(Collectors.toList())); - Map methodCache = multiMethodCache.getOrDefault(parameterStr, new HashMap<>()); - methodCache.put(parameterStr, new InterfaceMapping(workflowManageService, method)); + String parameterTypesMd5 = MD5.encrypt(StringUtils.collectionToCommaDelimitedString(Arrays.stream(method.getParameterTypes()).map(Class::getName).collect(Collectors.toList()))); + Map methodCache = multiMethodCache.getOrDefault(method.getName(), new HashMap<>()); + methodCache.put(parameterTypesMd5, new InterfaceMapping(workflowManageService, method)); multiMethodCache.put(method.getName(), methodCache); } } diff --git a/workflow-engine-spring-boot-starter/src/main/java/cn/axzo/workflow/starter/util/MD5.java b/workflow-engine-spring-boot-starter/src/main/java/cn/axzo/workflow/starter/util/MD5.java new file mode 100644 index 000000000..07fd12d59 --- /dev/null +++ b/workflow-engine-spring-boot-starter/src/main/java/cn/axzo/workflow/starter/util/MD5.java @@ -0,0 +1,46 @@ +package cn.axzo.workflow.starter.util; + +import java.math.BigInteger; +import java.nio.charset.StandardCharsets; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; + +/** + * Starter 专用的 MD5小工具 + * + * @author wangli + * @since 2025-03-05 16:45 + */ +public class MD5 { + + public static String encrypt(String data) { + if (data == null) { + return null; + } + try { + // 获取 MD5 算法实例 + MessageDigest md = MessageDigest.getInstance("MD5"); + // 将输入字符串转换为字节数组并进行加密 + byte[] digest = md.digest(data.getBytes(StandardCharsets.UTF_8)); + + // 将字节数组转换为 BigInteger + BigInteger bigInt = new BigInteger(1, digest); + // 将 BigInteger 转换为十六进制字符串 + String hashText = bigInt.toString(16); + // 不足 32 位时前面补 0 + while (hashText.length() < 32) { + hashText = "0" + hashText; + } + return hashText; + } catch (NoSuchAlgorithmException e) { + // 处理算法不可用的异常 + e.printStackTrace(); + return null; + } + } + + public static void main(String[] args) { + String encrypt = encrypt("123"); + System.out.println("encrypt = " + encrypt); + } +} From e4d766471391077938b432bfff5db7220141704f Mon Sep 17 00:00:00 2001 From: wangli <274027703@qq.com> Date: Fri, 9 May 2025 16:44:26 +0800 Subject: [PATCH 07/10] =?UTF-8?q?fix=20-=20=E5=A2=9E=E5=8A=A0=20BpmnFlowNo?= =?UTF-8?q?deType=20=E6=9E=9A=E4=B8=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/cn/axzo/workflow/common/enums/BpmnFlowNodeType.java | 1 + 1 file changed, 1 insertion(+) diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/BpmnFlowNodeType.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/BpmnFlowNodeType.java index 1856447f6..4f97157da 100644 --- a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/BpmnFlowNodeType.java +++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/BpmnFlowNodeType.java @@ -21,6 +21,7 @@ public enum BpmnFlowNodeType { NODE_ROBOT("NODE_ROBOT", "机器人节点"), NODE_COMMENT("NODE_COMMENT", "评论节点"), NODE_ABORT("NODE_ABORT", "中止节点"), + NODE_ALTER("NODE_ALTER", "告警节点"), NODE_CANCEL("NODE_CANCEL", "撤回节点"), NODE_EMPTY("NODE_EMPTY", "空节点"), ; From 06fb598e5c7c14f64337c08aee5c96887b250791 Mon Sep 17 00:00:00 2001 From: wangli <274027703@qq.com> Date: Wed, 30 Jul 2025 17:16:27 +0800 Subject: [PATCH 08/10] =?UTF-8?q?feat(REQ-4624)=20-=20=E9=92=88=E5=AF=B9?= =?UTF-8?q?=20BpmnTaskDelegateAssigner=20=E6=A8=A1=E5=9E=8B=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=20personId=20=E7=9A=84=E5=88=A4=E6=96=AD=E8=BD=AC?= =?UTF-8?q?=E6=8D=A2=E5=87=BD=E6=95=B0=EF=BC=8C=E9=81=BF=E5=85=8D=E4=B8=9A?= =?UTF-8?q?=E5=8A=A1=E5=87=BA=E7=8E=B0=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bpmn/task/BpmnTaskDelegateAssigner.java | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/task/BpmnTaskDelegateAssigner.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/task/BpmnTaskDelegateAssigner.java index 440ce176e..4316baeeb 100644 --- a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/task/BpmnTaskDelegateAssigner.java +++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/task/BpmnTaskDelegateAssigner.java @@ -8,6 +8,7 @@ import lombok.Data; import lombok.NoArgsConstructor; import lombok.experimental.Accessors; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.math.NumberUtils; import org.dromara.easyes.annotation.IndexField; import org.dromara.easyes.annotation.rely.FieldType; import org.springframework.util.StringUtils; @@ -78,6 +79,8 @@ public class BpmnTaskDelegateAssigner implements Serializable { * 对应安心筑特殊的PersonId *

* 仅安心筑使用, 应该必传 + *

+ *

注意:该属性在部分场景下会是非 Long 类型的值,建议业务消费时,调用{@link BpmnTaskDelegateAssigner#parsePersonId()}函数进行转换

*/ @IndexField(fieldType = FieldType.KEYWORD) private String personId; @@ -217,4 +220,27 @@ public class BpmnTaskDelegateAssigner implements Serializable { public static BpmnTaskDelegateAssigner toObject(String jsonStr) { return JSON.parseObject(jsonStr, BpmnTaskDelegateAssigner.class); } + + /** + * @return + */ + public Long parsePersonId() { + if (NumberUtils.isDigits(personId)) { + return Long.parseLong(personId); + } else { + return 0L; + } + } + + public static void main(String[] args) { + BpmnTaskDelegateAssigner assigner = new BpmnTaskDelegateAssigner(); + assigner.setPersonId("system"); + System.out.println("assigner.parsePersonId() = " + assigner.parsePersonId()); + + assigner.setPersonId(""); + System.out.println("assigner.parsePersonId() = " + assigner.parsePersonId()); + + assigner.setPersonId("123"); + System.out.println("assigner.parsePersonId() = " + assigner.parsePersonId()); + } } From 5cd980e4d15c5107adf126aa2b0ab5cb3ac90e72 Mon Sep 17 00:00:00 2001 From: wangli <274027703@qq.com> Date: Wed, 30 Jul 2025 17:16:27 +0800 Subject: [PATCH 09/10] =?UTF-8?q?feat(REQ-4624)=20-=20=E9=92=88=E5=AF=B9?= =?UTF-8?q?=20BpmnTaskDelegateAssigner=20=E6=A8=A1=E5=9E=8B=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=20personId=20=E7=9A=84=E5=88=A4=E6=96=AD=E8=BD=AC?= =?UTF-8?q?=E6=8D=A2=E5=87=BD=E6=95=B0=EF=BC=8C=E9=81=BF=E5=85=8D=E4=B8=9A?= =?UTF-8?q?=E5=8A=A1=E5=87=BA=E7=8E=B0=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bpmn/task/BpmnTaskDelegateAssigner.java | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/task/BpmnTaskDelegateAssigner.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/task/BpmnTaskDelegateAssigner.java index 74200ae54..286bf2b1f 100644 --- a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/task/BpmnTaskDelegateAssigner.java +++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/task/BpmnTaskDelegateAssigner.java @@ -9,6 +9,7 @@ import lombok.Data; import lombok.NoArgsConstructor; import lombok.experimental.Accessors; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.math.NumberUtils; import org.dromara.easyes.annotation.IndexField; import org.dromara.easyes.annotation.rely.FieldType; import org.springframework.util.StringUtils; @@ -79,6 +80,8 @@ public class BpmnTaskDelegateAssigner implements Serializable { * 对应安心筑特殊的PersonId *

* 仅安心筑使用, 应该必传 + *

+ *

注意:该属性在部分场景下会是非 Long 类型的值,建议业务消费时,调用{@link BpmnTaskDelegateAssigner#parsePersonId()}函数进行转换

*/ @IndexField(fieldType = FieldType.KEYWORD) private String personId; @@ -236,4 +239,27 @@ public class BpmnTaskDelegateAssigner implements Serializable { public static BpmnTaskDelegateAssigner toObject(String jsonStr) { return JSON.parseObject(jsonStr, BpmnTaskDelegateAssigner.class); } + + /** + * @return + */ + public Long parsePersonId() { + if (NumberUtils.isDigits(personId)) { + return Long.parseLong(personId); + } else { + return 0L; + } + } + + public static void main(String[] args) { + BpmnTaskDelegateAssigner assigner = new BpmnTaskDelegateAssigner(); + assigner.setPersonId("system"); + System.out.println("assigner.parsePersonId() = " + assigner.parsePersonId()); + + assigner.setPersonId(""); + System.out.println("assigner.parsePersonId() = " + assigner.parsePersonId()); + + assigner.setPersonId("123"); + System.out.println("assigner.parsePersonId() = " + assigner.parsePersonId()); + } } From 1831d01da450699edab71bb882076dde7ae07037 Mon Sep 17 00:00:00 2001 From: wangli <274027703@qq.com> Date: Fri, 1 Aug 2025 11:40:36 +0800 Subject: [PATCH 10/10] =?UTF-8?q?feat(timer=5Falter)=20-=20=E8=B0=83?= =?UTF-8?q?=E6=95=B4=E5=91=8A=E8=AD=A6=E9=80=BB=E8=BE=91=E7=9A=84=E9=80=BB?= =?UTF-8?q?=E8=BE=91=EF=BC=8C=E5=B0=9D=E8=AF=95=E7=9C=8B=E8=83=BD=E5=90=A6?= =?UTF-8?q?=E9=81=BF=E5=85=8D=20FK=20=EF=BC=8Cdeadlock=20=E7=9A=84?= =?UTF-8?q?=E5=BC=82=E5=B8=B8=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../model/dto/TermNodeAddTimerJobDTO.java | 3 +- .../core/engine/cmd/CustomAddTimerJobCmd.java | 63 +++++++++---------- .../job/AsyncTermNodeAlterJobHandler.java | 49 +++++++-------- .../AddTimerJobTransactionListener.java | 2 +- ...BpmnActivityEventListener_lo_Listener.java | 27 +------- 5 files changed, 56 insertions(+), 88 deletions(-) diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/dto/TermNodeAddTimerJobDTO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/dto/TermNodeAddTimerJobDTO.java index d075b7194..c5e955d78 100644 --- a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/dto/TermNodeAddTimerJobDTO.java +++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/dto/TermNodeAddTimerJobDTO.java @@ -22,5 +22,6 @@ import java.io.Serializable; public class TermNodeAddTimerJobDTO implements Serializable { private String processInstanceId; private String activityId; - private String timeCycle; + private Integer delayTime; + private String timeUnit; } diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomAddTimerJobCmd.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomAddTimerJobCmd.java index 31cae5f7b..8e44f1ba2 100644 --- a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomAddTimerJobCmd.java +++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomAddTimerJobCmd.java @@ -1,24 +1,19 @@ package cn.axzo.workflow.core.engine.cmd; import cn.axzo.workflow.common.model.dto.TermNodeAddTimerJobDTO; -import cn.axzo.workflow.core.converter.json.NotSupportConverter; import cn.axzo.workflow.core.engine.job.AsyncTermNodeAlterJobHandler; +import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSON; import lombok.extern.slf4j.Slf4j; -import org.flowable.bpmn.model.TimerEventDefinition; import org.flowable.common.engine.impl.interceptor.CommandContext; import org.flowable.engine.ManagementService; import org.flowable.engine.impl.cfg.ProcessEngineConfigurationImpl; -import org.flowable.engine.impl.jobexecutor.TimerEventHandler; -import org.flowable.engine.impl.persistence.entity.ExecutionEntity; import org.flowable.engine.impl.util.CommandContextUtil; -import org.flowable.engine.impl.util.TimerUtil; -import org.flowable.engine.runtime.Execution; +import org.flowable.job.service.TimerJobService; import org.flowable.job.service.impl.persistence.entity.TimerJobEntity; -import org.springframework.util.CollectionUtils; import java.io.Serializable; -import java.util.List; +import java.util.Date; /** * 自定义添加定时任务的逻辑 @@ -41,37 +36,39 @@ public class CustomAddTimerJobCmd extends AbstractCommand implements Seria @Override public Void executeInternal(CommandContext commandContext) { - log.info("CustomAddTimerJobCmd start. instanceId: {}, activityId: {}, timeCycle: {}", dto.getProcessInstanceId(), dto.getActivityId(), dto.getTimeCycle()); + log.info("CustomAddTimerJobCmd start. instanceId: {}, activityId: {}, delayTime: {}, timeUnit: {}", dto.getProcessInstanceId(), dto.getActivityId(), dto.getDelayTime(), dto.getTimeUnit()); ProcessEngineConfigurationImpl processEngineConfiguration = CommandContextUtil.getProcessEngineConfiguration(commandContext); ManagementService managementService = processEngineConfiguration.getManagementService(); - String tableName = managementService.getTableName(Execution.class); - List list = processEngineConfiguration.getRuntimeService() - .createNativeExecutionQuery() - .sql("SELECT * FROM " + tableName + " WHERE PROC_INST_ID_ = #{instanceId} AND ACT_ID_ = #{activityId} AND IS_ACTIVE_ = 1 AND TASK_COUNT_ = 1") - .parameter("instanceId", dto.getProcessInstanceId()) - .parameter("activityId", dto.getActivityId()) - .list(); - if (CollectionUtils.isEmpty(list)) { - return null; + Date alterTime; + switch (dto.getTimeUnit()) { + case "M": + alterTime = DateUtil.offsetDay(new Date(), dto.getDelayTime()); + break; + case "H": + alterTime = DateUtil.offsetHour(new Date(), dto.getDelayTime()); + break; + default: + alterTime = DateUtil.offsetSecond(new Date(), dto.getDelayTime()); + break; } - if (list.get(list.size() - 1) instanceof ExecutionEntity) { - ExecutionEntity executionEntity = (ExecutionEntity) list.get(list.size() - 1); - TimerEventDefinition timerEventDefinition = new TimerEventDefinition(); - timerEventDefinition.setTimeCycle(dto.getTimeCycle()); - TimerJobEntity timerJob = TimerUtil.createTimerEntityForTimerEventDefinition(timerEventDefinition, - new NotSupportConverter.NotSupportFlowElement(), - false, executionEntity, AsyncTermNodeAlterJobHandler.TYPE, - TimerEventHandler.createConfiguration(executionEntity.getCurrentActivityId(), null, - timerEventDefinition.getCalendarName())); - if (timerJob != null) { - CommandContextUtil.getTimerJobService().scheduleTimerJob(timerJob); - } - } else { - log.warn("未找到 execution entity"); - } + managementService.executeCommand(context -> { + TimerJobService timerJobService = CommandContextUtil.getTimerJobService(); + TimerJobEntity timerJobEntity = timerJobService.createTimerJob(); + timerJobEntity.setJobType("timer"); + timerJobEntity.setJobHandlerType(AsyncTermNodeAlterJobHandler.TYPE); // 这里填写你自定义的 JobHandler 类型 + timerJobEntity.setProcessInstanceId(dto.getProcessInstanceId()); + timerJobEntity.setExecutionId(null); + timerJobEntity.setDuedate(alterTime); // 立即执行 + timerJobEntity.setRepeat(null); // 不重复 + timerJobEntity.setRetries(1); + timerJobEntity.setJobHandlerConfiguration(dto.getActivityId()); // 可选,传递参数 + timerJobService.scheduleTimerJob(timerJobEntity); + return null; + }); + return null; } } diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/job/AsyncTermNodeAlterJobHandler.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/job/AsyncTermNodeAlterJobHandler.java index 192da572c..326f24169 100644 --- a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/job/AsyncTermNodeAlterJobHandler.java +++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/job/AsyncTermNodeAlterJobHandler.java @@ -5,14 +5,11 @@ import cn.axzo.workflow.common.model.dto.AlterDTO; import cn.axzo.workflow.common.model.dto.TermNodePausingDTO; import cn.axzo.workflow.core.common.utils.SpringContextUtils; import cn.axzo.workflow.core.conf.SupportRefreshProperties; -import cn.axzo.workflow.core.engine.tx.listener.DeleteTimerJobTransactionListener; import cn.axzo.workflow.core.listener.Alter; import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import lombok.extern.slf4j.Slf4j; -import org.flowable.common.engine.impl.cfg.TransactionState; -import org.flowable.common.engine.impl.context.Context; import org.flowable.common.engine.impl.interceptor.CommandContext; import org.flowable.engine.RuntimeService; import org.flowable.engine.TaskService; @@ -71,9 +68,8 @@ public class AsyncTermNodeAlterJobHandler extends AbstractJobHandler implements tasks.forEach(e -> { sb.append("id:").append(e.getId()).append(", assignee: ").append(e.getAssignee()); }); - log.info("tasks size:{}", JSON.toJSONString(sb)); + log.info("tasks size:{}, info: {}", tasks.size(), JSON.toJSONString(sb)); if (CollectionUtils.isEmpty(tasks) || tasks.size() > 1 || hasAssignee(tasks.get(0).getAssignee())) { - deleteTimerJob(dto); return; } if (DateUtil.compare(DateUtil.date(), DateUtil.offsetMinute(tasks.get(0).getCreateTime(), refreshProperties.getPauseDelay())) <= 0) { @@ -82,30 +78,27 @@ public class AsyncTermNodeAlterJobHandler extends AbstractJobHandler implements // 不允许重复告警 if (!refreshProperties.getRepeatAlter() && dto.getRetries() > 0) { - deleteTimerJob(dto); + return; + } + // 超过告警次数 + if (refreshProperties.getAlterRetries() != 0 && dto.getRetries() >= refreshProperties.getAlterRetries()) { return; } + // 发送告警对象 + Alter alter = SpringContextUtils.getBean(Alter.class); + AlterDTO alterDTO = new AlterDTO(); + alterDTO.setProcessInstanceId(dto.getProcessInstanceId()); + alterDTO.setActivityId(dto.getActivityId()); + alterDTO.setTaskId(tasks.get(0).getId()); + alterDTO.setStartTime(tasks.get(0).getCreateTime()); + alterDTO.setPrettyStartTime(DateUtil.formatDateTime(tasks.get(0).getCreateTime())); + if (Boolean.TRUE.equals(refreshProperties.getAlterSendDingTalk())) { + alter.invoke(alterDTO); - if (refreshProperties.getAlterRetries() == 0 || dto.getRetries() < refreshProperties.getAlterRetries()) { - // 发送告警对象 - Alter alter = SpringContextUtils.getBean(Alter.class); - AlterDTO alterDTO = new AlterDTO(); - alterDTO.setProcessInstanceId(dto.getProcessInstanceId()); - alterDTO.setActivityId(dto.getActivityId()); - alterDTO.setTaskId(tasks.get(0).getId()); - alterDTO.setStartTime(tasks.get(0).getCreateTime()); - alterDTO.setPrettyStartTime(DateUtil.formatDateTime(tasks.get(0).getCreateTime())); - if (Boolean.TRUE.equals(refreshProperties.getAlterSendDingTalk())) { - alter.invoke(alterDTO); + // 记录告警次数 + incRetries(job, dto, runtimeService, activityId); - // 记录告警次数 - incRetries(job, dto, runtimeService, activityId); - - if (refreshProperties.getAlterRetries() != 0 && dto.getRetries() >= refreshProperties.getAlterRetries()) { - deleteTimerJob(dto); - } - } } } @@ -114,10 +107,10 @@ public class AsyncTermNodeAlterJobHandler extends AbstractJobHandler implements runtimeService.setVariable(job.getProcessInstanceId(), BIZ_NODE_ALTER + activityId, dto); } - private void deleteTimerJob(TermNodePausingDTO dto) { - Context.getTransactionContext().addTransactionListener(TransactionState.COMMITTED, - new DeleteTimerJobTransactionListener(dto)); - } +// private void deleteTimerJob(TermNodePausingDTO dto) { +// Context.getTransactionContext().addTransactionListener(TransactionState.COMMITTED, +// new DeleteTimerJobTransactionListener(dto)); +// } private Boolean hasAssignee(String assignee) { if (!StringUtils.hasText(assignee)) { diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/tx/listener/AddTimerJobTransactionListener.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/tx/listener/AddTimerJobTransactionListener.java index 92612305f..561c1fb69 100644 --- a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/tx/listener/AddTimerJobTransactionListener.java +++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/tx/listener/AddTimerJobTransactionListener.java @@ -22,7 +22,7 @@ public class AddTimerJobTransactionListener implements TransactionListener { @Override public void execute(CommandContext commandContext) { - log.info("add timer job listener. instanceId: {}, activityId: {}, timeCycle: {}", dto.getProcessInstanceId(), dto.getActivityId(), dto.getTimeCycle()); + log.info("add timer job listener. instanceId: {}, activityId: {}, delayTime: {}, timeUnit: {}", dto.getProcessInstanceId(), dto.getActivityId(), dto.getDelayTime(), dto.getTimeUnit()); ProcessEngineConfigurationImpl processEngineConfiguration = CommandContextUtil.getProcessEngineConfiguration(commandContext); processEngineConfiguration.getCommandExecutor().execute(new CustomAddTimerJobCmd(dto)); diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/listener/impl/InternalBpmnActivityEventListener_lo_Listener.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/listener/impl/InternalBpmnActivityEventListener_lo_Listener.java index a72a4a268..cde40df9d 100644 --- a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/listener/impl/InternalBpmnActivityEventListener_lo_Listener.java +++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/listener/impl/InternalBpmnActivityEventListener_lo_Listener.java @@ -7,7 +7,6 @@ import cn.axzo.workflow.core.common.context.ActivityOperationContext; import cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper; import cn.axzo.workflow.core.conf.SupportRefreshProperties; import cn.axzo.workflow.core.engine.tx.listener.AddTimerJobTransactionListener; -import cn.axzo.workflow.core.engine.tx.listener.DeleteTimerJobTransactionListener; import cn.axzo.workflow.core.listener.AbstractBpmnEventListener; import cn.axzo.workflow.core.listener.BpmnActivityEventListener; import lombok.AllArgsConstructor; @@ -91,7 +90,8 @@ public class InternalBpmnActivityEventListener_lo_Listener extends AbstractBpmnE TermNodeAddTimerJobDTO addTimerJobDTO = new TermNodeAddTimerJobDTO(); addTimerJobDTO.setProcessInstanceId(execution.getProcessInstanceId()); addTimerJobDTO.setActivityId(execution.getCurrentActivityId()); - addTimerJobDTO.setTimeCycle("R100/PT" + refreshProperties.getAlterInterval() + timeUnit); + addTimerJobDTO.setDelayTime(refreshProperties.getAlterInterval()); + addTimerJobDTO.setTimeUnit(timeUnit); Context.getTransactionContext().addTransactionListener(TransactionState.COMMITTED, new AddTimerJobTransactionListener(addTimerJobDTO)); @@ -104,27 +104,4 @@ public class InternalBpmnActivityEventListener_lo_Listener extends AbstractBpmnE }); } - /** - * 节点已取消 - * - * @param execution - */ - @Override - public void onEnd(DelegateExecution execution) { -// ProcessEngineConfigurationImpl processEngineConfiguration = CommandContextUtil.getProcessEngineConfiguration(); -// ManagementService managementService = processEngineConfiguration.getManagementService(); -// Job timerJob = managementService.createTimerJobQuery() -// .elementId(execution.getCurrentActivityId()) -// .processInstanceId(execution.getProcessInstanceId()) -// .singleResult(); -// if (Objects.nonNull(timerJob)) { -// CommandContextUtil.getTimerJobService().deleteTimerJob((TimerJobEntity) timerJob); -// } - TermNodePausingDTO dto = new TermNodePausingDTO(); - dto.setActivityId(execution.getCurrentActivityId()); - dto.setProcessInstanceId(execution.getProcessInstanceId()); - dto.setRetries(1); - Context.getTransactionContext().addTransactionListener(TransactionState.COMMITTED, - new DeleteTimerJobTransactionListener(dto)); - } }