Camund-ENGINE-16004 Exception while closing command context null

ENGINE-16004 Exception while closing command context null

1、 问题产生原因

  1. 在使用Camunda 引擎执行流程时,产生的该问题
  2. 在设计流程时(Camunda modeler流程编辑器)起初是通过节点中的inputs栏目设置传入参数,实现动态受理人Assingnee的设置。该步骤已经实现。
  3. 后续升级,通过节点中的TaskListeners 任务监听器来实现动态受理人的设置,后续在通过监听器中实现传参,后台获取参数后动态设置受理人Assignee。然后在审核该taskListeners节点时就出现了该错误!!!

报错内容:

java.lang.StackOverflowError: null
at java.security.AccessController.doPrivileged(Native Method) ~[na:1.8.0_201]
at java.net.URLClassLoader$3.next(URLClassLoader.java:601) ~[na:1.8.0_201]
at java.net.URLClassLoader 3. h a s M o r e E l e m e n t s ( U R L C l a s s L o a d e r . j a v a : 626 )   [ n a : 1.8. 0 2 01 ] a t s u n . m i s c . C o m p o u n d E n u m e r a t i o n . n e x t ( C o m p o u n d E n u m e r a t i o n . j a v a : 45 )   [ n a : 1.8. 0 2 01 ] a t s u n . m i s c . C o m p o u n d E n u m e r a t i o n . h a s M o r e E l e m e n t s ( C o m p o u n d E n u m e r a t i o n . j a v a : 54 )   [ n a : 1.8. 0 2 01 ] a t s u n . m i s c . C o m p o u n d E n u m e r a t i o n . n e x t ( C o m p o u n d E n u m e r a t i o n . j a v a : 45 )   [ n a : 1.8. 0 2 01 ] a t s u n . m i s c . C o m p o u n d E n u m e r a t i o n . h a s M o r e E l e m e n t s ( C o m p o u n d E n u m e r a t i o n . j a v a : 54 )   [ n a : 1.8. 0 2 01 ] a t o r g . a p a c h e . c a t a l i n a . l o a d e r . W e b a p p C l a s s L o a d e r B a s e 3.hasMoreElements(URLClassLoader.java:626) ~[na:1.8.0_201] at sun.misc.CompoundEnumeration.next(CompoundEnumeration.java:45) ~[na:1.8.0_201] at sun.misc.CompoundEnumeration.hasMoreElements(CompoundEnumeration.java:54) ~[na:1.8.0_201] at sun.misc.CompoundEnumeration.next(CompoundEnumeration.java:45) ~[na:1.8.0_201] at sun.misc.CompoundEnumeration.hasMoreElements(CompoundEnumeration.java:54) ~[na:1.8.0_201] at org.apache.catalina.loader.WebappClassLoaderBase 3.hasMoreElements(URLClassLoader.java:626) [na:1.8.0201]atsun.misc.CompoundEnumeration.next(CompoundEnumeration.java:45) [na:1.8.0201]atsun.misc.CompoundEnumeration.hasMoreElements(CompoundEnumeration.java:54) [na:1.8.0201]atsun.misc.CompoundEnumeration.next(CompoundEnumeration.java:45) [na:1.8.0201]atsun.misc.CompoundEnumeration.hasMoreElements(CompoundEnumeration.java:54) [na:1.8.0201]atorg.apache.catalina.loader.WebappClassLoaderBaseCombinedEnumeration.inc(WebappClassLoaderBase.java:2757) ~[tomcat-embed-core-9.0.69.jar:9.0.69]
at org.apache.catalina.loader.WebappClassLoaderBase C o m b i n e d E n u m e r a t i o n . h a s M o r e E l e m e n t s ( W e b a p p C l a s s L o a d e r B a s e . j a v a : 2742 )   [ t o m c a t − e m b e d − c o r e − 9.0.69. j a r : 9.0.69 ] a t j a v a . u t i l . S e r v i c e L o a d e r CombinedEnumeration.hasMoreElements(WebappClassLoaderBase.java:2742) ~[tomcat-embed-core-9.0.69.jar:9.0.69] at java.util.ServiceLoader CombinedEnumeration.hasMoreElements(WebappClassLoaderBase.java:2742) [tomcatembedcore9.0.69.jar:9.0.69]atjava.util.ServiceLoaderLazyIterator.hasNextService(ServiceLoader.java:354) ~[na:1.8.0_201]
at java.util.ServiceLoader$LazyIterator.hasNext(ServiceLoader.java:393) ~[na:1.8.0_201]
at java.util.ServiceLoader$1.hasNext(ServiceLoader.java:474) ~[na:1.8.0_201]
at javax.xml.transform.FactoryFinder$1.run(FactoryFinder.java:279) ~[na:1.8.0_201]
at java.security.AccessController.doPrivileged(Native Method) ~[na:1.8.0_201]
at javax.xml.transform.FactoryFinder.findServiceProvider(FactoryFinder.java:275) ~[na:1.8.0_201]
at javax.xml.transform.FactoryFinder.find(FactoryFinder.java:251) ~[na:1.8.0_201]
at javax.xml.transform.TransformerFactory.newInstance(TransformerFactory.java:106) ~[na:1.8.0_201]
at com.alibaba.fastjson.serializer.MiscCodec.toString(MiscCodec.java:171) ~[fastjson-1.2.83.jar:na]
at com.alibaba.fastjson.serializer.MiscCodec.write(MiscCodec.java:161) ~[fastjson-1.2.83.jar:na]
at com.alibaba.fastjson.serializer.JSONSerializer.writeWithFieldName(JSONSerializer.java:360) ~[fastjson-1.2.83.jar:na]
at com.alibaba.fastjson.serializer.ASMSerializer_2_DOMSource.write(Unknown Source) ~[na:na]
at com.alibaba.fastjson.serializer.ASMSerializer_1_DomDocumentImpl.write(Unknown Source) ~[na:na]
at com.alibaba.fastjson.serializer.FieldSerializer.writeValue(FieldSerializer.java:318) ~[fastjson-1.2.83.jar:na]
at com.alibaba.fastjson.serializer.JavaBeanSerializer.write(JavaBeanSerializer.java:472) ~[fastjson-1.2.83.jar:na]
at com.alibaba.fastjson.serializer.JavaBeanSerializer.write(JavaBeanSerializer.java:154) ~[fastjson-1.2.83.jar:na]
at com.alibaba.fastjson.serializer.ListSerializer.write(ListSerializer.java:135) ~[fastjson-1.2.83.jar:na]
at com.alibaba.fastjson.serializer.FieldSerializer.writeValue(FieldSerializer.java:318) ~[fastjson-1.2.83.jar:na]
at com.alibaba.fastjson.serializer.JavaBeanSerializer.write(JavaBeanSerializer.java:472) ~[fastjson-1.2.83.jar:na]
at com.alibaba.fastjson.serializer.JavaBeanSerializer.write(JavaBeanSerializer.java:154) ~[fastjson-1.2.83.jar:na]
at com.alibaba.fastjson.serializer.ListSerializer.write(ListSerializer.java:135) ~[fastjson-1.2.83.jar:na]
at com.alibaba.fastjson.serializer.FieldSerializer.writeValue(FieldSerializer.java:318) ~[fastjson-1.2.83.jar:na]
at com.alibaba.fastjson.serializer.JavaBeanSerializer.write(JavaBeanSerializer.java:472) ~[fastjson-1.2.83.jar:na]
at com.alibaba.fastjson.serializer.JavaBeanSerializer.write(JavaBeanSerializer.java:154) ~[fastjson-1.2.83.jar:na]
at com.alibaba.fastjson.serializer.ListSerializer.write(ListSerializer.java:135) ~[fastjson-1.2.83.jar:na]
at com.alibaba.fastjson.serializer.FieldSerializer.writeValue(FieldSerializer.java:318) ~[fastjson-1.2.83.jar:na]
at com.alibaba.fastjson.serializer.JavaBeanSerializer.write(JavaBeanSerializer.java:472) ~[fastjson-1.2.83.jar:na]
at com.alibaba.fastjson.serializer.JavaBeanSerializer.write(JavaBeanSerializer.java:154) ~[fastjson-1.2.83.jar:na]
at com.alibaba.fastjson.serializer.JSONSerializer.writeWithFieldName(JSONSerializer.java:360) ~[fastjson-1.2.83.jar:na]
at com.alibaba.fastjson.serializer.ASMSerializer_1_DomDocumentImpl.write(Unknown Source) ~[na:na]
at com.alibaba.fastjson.serializer.FieldSerializer.writeValue(FieldSerializer.java:318) ~[fastjson-1.2.83.jar:na]
at com.alibaba.fastjson.serializer.JavaBeanSerializer.write(JavaBeanSerializer.java:472) ~[fastjson-1.2.83.jar:na]
at com.alibaba.fastjson.serializer.JavaBeanSerializer.write(JavaBeanSerializer.java:154) ~[fastjson-1.2.83.jar:na]
at com.alibaba.fastjson.serializer.ListSerializer.write(ListSerializer.java:135) ~[fastjson-1.2.83.jar:na]
at com.alibaba.fastjson.serializer.FieldSerializer.writeValue(FieldSerializer.java:318) ~[fastjson-1.2.83.jar:na]
at com.alibaba.fastjson.serializer.JavaBeanSerializer.write(JavaBeanSerializer.java:472) ~[fastjson-1.2.83.jar:na]
at com.alibaba.fastjson.serializer.JavaBeanSerializer.write(JavaBeanSerializer.java:154) ~[fastjson-1.2.83.jar:na]
at com.alibaba.fastjson.serializer.ListSerializer.write(ListSerializer.java:135) ~[fastjson-1.2.83.jar:na]

  • Camunda Modeler 中TaskListeners的设置

在这里插入图片描述

​ 如图所示,分别在任务节点上的任务监听器TaskListeners中设置了监听器实现类Java Class,已经携带了参数传入后台 Field Injection

2、 问题的排查过程

  1. 最开始通过网上查阅,有资料说是数据库冲突问题,后续将数据库删除后重建,执行该流程时还是出现该错误,但是执行其他流程还是正常运行的。这里就排除了其他问题,锁定了是该流程的问题。
  2. 通过排除该流程发现,在不设置TaskListeners 任务监听器时,该流程模板也能正常运行,后以为是该任务监听器所导致的该异常。 但是在执行其他含有任务监听器的流程时,却能正常的执行,并未出现该错误!!
  3. 后续怀疑是任务监听器传入参数导致的该错误!后将流程调整使任务监听器不进行传参,但是在执行该流程是还是会报错。也尝试过滤掉后台中任务监听器的实现类,获取参数的部门代码注释掉还是同样会报该异常!!
  4. 最后检测后端的代码,通过对比正常情况下的任务监听器代码 和 参数该异常的任务监听器代码。逐一排查,查到了问题所在。

3、问题原因

  • 先观察一下后台任务监听器实现类代码
package cn.zhidasifang.camundaproject.camundaListeners.tasklisteners;

import cn.zhidasifang.camundaproject.utils.LogUtils;
import lombok.Data;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.camunda.bpm.engine.delegate.DelegateTask;
import org.camunda.bpm.engine.delegate.Expression;
import org.camunda.bpm.engine.delegate.TaskListener;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

/**
 * @Description:节点开始前的监听器,通过input中的参数设置对应的审核人信息!---动态地为任务分配办理人,而不是在流程定义中静态地指定。
 * @ClassName: StartListennersSetAssignee
 */
@Component
@Slf4j
@RequiredArgsConstructor
public class StartListenersSetAssignee implements TaskListener {
//这里定义的Expression  字段名称必须要和流程中 Field Injection 名称一致
    private Expression listenerField1;
    private Expression listenerField2;

    @Override
    public void notify(DelegateTask delegateTask) {
        LogUtils.writeLogger(LoggerFactory.getLogger(this.getClass()),delegateTask,"节点创建监听器-CreateListener执行!");

        /**
        * 获取Listeners Field injection 参数。 监听器中注入的参数获取方式!
        * */
        String value = (String) listenerField1.getValue(delegateTask);
        String value2 = (String) listenerField2.getValue(delegateTask);
        System.out.println("监听器Listeners中注入的参数为   listenerField1="+value+"    listenerField2="+value2);

        /**
         * 获取监听器类型
         * */
        String eventName = delegateTask.getEventName();
        System.out.println("eventName = " + eventName);

        /**
         * 获取camunda中的各种服务Service
         * delegateTask.getProcessEngine() //基础引擎获取其他各类Service
         * */

        /**
         * 监听器中,获取inputs中注入的参数数据:
         * */
        //方式1:
        String  type1 = (String) delegateTask.getVariable("type");
        System.out.println("type1 = " + type1);
        //方式2:
        String type2 =(String) delegateTask.getProcessEngine().getRuntimeService().getVariables(delegateTask.getExecutionId()).get("type");
        System.out.println("type2 = " + type2);
        delegateTask.setAssignee(type1);
        // TODO: 2023-10-20 正常情况下会去数据库获取对应上级userId  setAssignee
    }
}

​ 通过与正常执行的任务监听器对比下来。唯一不同的是该任务监听器中,我调用了自己封装的一个日志类导致了该问题的出现,经过调整后,该异常就解决了!!

在这里插入图片描述

后续正常后的执行结果!!!!

2023-10-20 13:33:01.622 INFO 9656 — [nio-8080-exec-9] c.z.c.c.t.StartListenersSetAssignee : 监听器Listeners执行成功!。。。。。。。。。。。。
监听器Listeners中注入的参数为 listenerField1=test1 listenerField2=test2
eventName = create
type1 = AssigneeUserType
type2 = AssigneeUserType

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值