Camunda bpmn计时器事件找不到Java委托

问题描述

我有一个简单的bpmn流程:

<?xml version="1.0" encoding="UTF-8"?>
<bpmn:deFinitions xmlns:bpmn="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:camunda="http://camunda.org/schema/1.0/bpmn" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" id="DeFinitions_0m0cnse" targetNamespace="http://bpmn.io/schema/bpmn" exporter="Camunda Modeler" exporterVersion="4.2.0">
  <bpmn:process id="Process_1aegwvb" isExecutable="true">
    <bpmn:sequenceFlow id="Flow_1dfd8um" sourceRef="StartEvent_1" targetRef="Activity_047mv6x" />
    <bpmn:endEvent id="Event_1vradpp">
      <bpmn:incoming>Flow_19hnbhv</bpmn:incoming>
    </bpmn:endEvent>
    <bpmn:sequenceFlow id="Flow_19hnbhv" sourceRef="Activity_047mv6x" targetRef="Event_1vradpp" />
    <bpmn:startEvent id="StartEvent_1">
      <bpmn:outgoing>Flow_1dfd8um</bpmn:outgoing>
      <bpmn:timerEventDeFinition id="TimerEventDeFinition_1ah7red">
        <bpmn:timeCycle xsi:type="bpmn:tFormalExpression">0 0/5 * * * ?</bpmn:timeCycle>
      </bpmn:timerEventDeFinition>
    </bpmn:startEvent>
    <bpmn:serviceTask id="Activity_047mv6x" name="Get users" camunda:class="*.Cron">
      <bpmn:incoming>Flow_1dfd8um</bpmn:incoming>
      <bpmn:outgoing>Flow_19hnbhv</bpmn:outgoing>
    </bpmn:serviceTask>
  </bpmn:process>
  <bpmndi:BPMNDiagram id="BPMNDiagram_1">
    <bpmndi:BPMNPlane id="BPMNPlane_1" bpmnElement="Process_1aegwvb">
      <bpmndi:BPMNEdge id="Flow_19hnbhv_di" bpmnElement="Flow_19hnbhv">
        <di:waypoint x="370" y="117" />
        <di:waypoint x="432" y="117" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="Flow_1dfd8um_di" bpmnElement="Flow_1dfd8um">
        <di:waypoint x="215" y="117" />
        <di:waypoint x="270" y="117" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNShape id="Event_1vradpp_di" bpmnElement="Event_1vradpp">
        <dc:Bounds x="432" y="99" width="36" height="36" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="Event_11i5xth_di" bpmnElement="StartEvent_1">
        <dc:Bounds x="179" y="99" width="36" height="36" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="Activity_01expgb_di" bpmnElement="Activity_047mv6x">
        <dc:Bounds x="270" y="77" width="100" height="80" />
      </bpmndi:BPMNShape>
    </bpmndi:BPMNPlane>
  </bpmndi:BPMNDiagram>
</bpmn:deFinitions>
  1. 将身份验证提供程序类和Cron类添加文件夹中的jar文件

camunda / webapps / engine-rest / WEB-INF / lib / camunda / webapps / camunda / WEB-INF / lib /

如果我在Camunda Webapp中或通过REST API手动启动此过程,则它可以正常工作并完成需要的工作。但是每5分钟我就会在日志中看到问题。

  1. 我需要在哪里将此类添加到类路径中?这是具有某些附加功能自定义身份验证提供程序等的Docker映像。

  2. Cron.java:

    公共类Cron实现JavaDelegate {

     @Override
     public void execute(DelegateExecution delegateExecution) {
         System.out.println("Test");
     }
    

    }

    2020年9月24日10:40:05.164严重[pool-2-thread-3] org.camunda.commons.logging.BaseLogger.logError ENGINE-16006 BPMN堆栈跟踪: Activity_047mv6x(活动执行,ProcessInstance [4ed42252-fe52-11ea-9efd-12baf36f6a87]) Activity_047mv6x,名称=获取用户 ^ | StartEvent_1

    2020年9月24日10:40:05.166严重[pool-2-thread-3] org.camunda.commons.logging.BaseLogger.logError ENGINE-16004关闭命令上下文时发生异常:ENGINE-09008实例化类时发生异常' .Cron':ENGINE-09017无法加载类' .Cron': .Cron org.camunda.bpm.engine.ProcessEngineException:ENGINE-09008实例化类' .Cron'时发生异常:ENGINE-09017无法加载类'* .Cron':* .Cron 在org.camunda.bpm.engine.impl.util.EngineUtilLogger.exceptionWhileInstantiatingClass(EngineUtilLogger.java:81)上......

    原因:java.lang.classNotFoundException:*。Cron 在java.net.urlclassloader.findClass(urlclassloader.java:382) 在java.lang.classLoader.loadClass(ClassLoader.java:424) 在java.lang.classLoader.loadClass(ClassLoader.java:357) 在java.lang.class.forName0(本地方法) 在java.lang.class.forName(Class.java:348) 在org.camunda.bpm.engine.impl.util.ReflectUtil.loadClass(ReflectUtil.java:87) ...还有92

解决方法

您的流程模型包含一个实现类型为Java Class的用户任务。 Java类名称设置为:* .Cron 因此,当您运行该过程时,引擎将尝试查找并实例化此名称的类。

https://docs.camunda.org/manual/latest/user-guide/process-engine/delegation-code/

要实现可在流程执行期间调用的类,此 班级需要实施 org.camunda.bpm.engine.delegate.JavaDelegate接口并提供 execute方法中的必需逻辑。流程执行到达时 在这一特定步骤,它将执行在 方法,并以默认的BPMN 2.0方式保留活动。

您需要更改流程模型以引用实际存在的类(https://docs.camunda.org/manual/latest/reference/bpmn20/tasks/service-task/)或使用其他实现方法。

您的Docker映像可能基于Camunda BPM运行。在此发行版中,可以将其他jar放在 userlib 文件夹中。 https://docs.camunda.org/manual/latest/user-guide/camunda-bpm-run/ 但是,由于您似乎在Java世界中并不熟悉,因此您可能需要考虑一种不同的方法来调用服务。例如,您可以将服务任务的实现更改为脚本任务或外部服务任务

https://docs.camunda.org/manual/latest/reference/bpmn20/tasks/script-task/

https://docs.camunda.org/manual/latest/reference/bpmn20/tasks/service-task/

,

通过使用Cron类包装战争创建独特的模块来解决问题。 然后将其添加为另一个Web应用程序。