JBPM 是否支持消息结束事件?

Does JBPM support message end events?

我正在使用 Jbpm 6.0.3(针对 Jboss EAP 6.1)。我正在尝试开发一个业务流程,它在开始消息中接收数据结构,并且 return 在流程结束时具有相同的结构。我正在尝试使用消息结束事件来结束进程,但 JBPM 似乎不支持它。

作为测试,我做了这个微不足道的过程。它以接收 Date 对象的开始消息开始,return在结束消息事件中使用相同的对象。

实际流程定义如下:

  <bpmn2:itemDefinition id="ItemDefinition_2" isCollection="false" structureRef="java.util.Date"/>
  <bpmn2:message id="date" itemRef="ItemDefinition_2" name="date"/>
  <bpmn2:process id="com.verizon.videa.publishwu.bpm.bp.Scratch" tns:packageName="com.verizon.videa.publishwu.bpm.bp" name="Scratch" isExecutable="true" processType="Private">
    <bpmn2:extensionElements>
      <tns:import name="java.util.Date"/>
    </bpmn2:extensionElements>
    <bpmn2:property id="dt" itemSubjectRef="ItemDefinition_2" name="dt"/>
    <bpmn2:startEvent id="StartEvent_1" name="StartProcess">
      <bpmn2:outgoing>SequenceFlow_1</bpmn2:outgoing>
      <bpmn2:dataOutput id="DataOutput_2" itemSubjectRef="ItemDefinition_2" name="event"/>
      <bpmn2:dataOutputAssociation id="DataOutputAssociation_1">
        <bpmn2:sourceRef>DataOutput_2</bpmn2:sourceRef>
        <bpmn2:targetRef>dt</bpmn2:targetRef>
      </bpmn2:dataOutputAssociation>
      <bpmn2:outputSet id="OutputSet_1" name="Output Set 1">
        <bpmn2:dataOutputRefs>DataOutput_2</bpmn2:dataOutputRefs>
      </bpmn2:outputSet>
      <bpmn2:messageEventDefinition id="MessageEventDefinition_1" messageRef="date"/>
    </bpmn2:startEvent>
    <bpmn2:endEvent id="EndEvent_1" name="End Event 1">
      <bpmn2:incoming>SequenceFlow_1</bpmn2:incoming>
      <bpmn2:dataInput id="DataInput_1" itemSubjectRef="ItemDefinition_2" name="Message_2_Input"/>
      <bpmn2:dataInputAssociation id="DataInputAssociation_1">
        <bpmn2:sourceRef>dt</bpmn2:sourceRef>
        <bpmn2:targetRef>DataInput_1</bpmn2:targetRef>
      </bpmn2:dataInputAssociation>
      <bpmn2:inputSet id="InputSet_1" name="Input Set 1">
        <bpmn2:dataInputRefs>DataInput_1</bpmn2:dataInputRefs>
      </bpmn2:inputSet>
      <bpmn2:messageEventDefinition id="MessageEventDefinition_2" messageRef="date"/>
    </bpmn2:endEvent>
    <bpmn2:sequenceFlow id="SequenceFlow_1" tns:priority="1" sourceRef="StartEvent_1" targetRef="EndEvent_1"/>
  </bpmn2:process>

我已经 运行 解决了两个问题。首先,Jbpm 显然将消息结束事件实现为 "Send Task" 事件。除非我为 "Send Task" 注册一个工作项处理程序,否则该过程将失败。其次,JBPM 中包含的 send task handler 是个笑话。这是处理程序的内容:

public void executeWorkItem(WorkItem workItem, WorkItemManager manager) {
    String message = (String) workItem.getParameter("Message");
    logger.debug("Sending message: {}", message);
    manager.completeWorkItem(workItem.getId(), null);
}

除非消息负载是字符串,否则它会失败并出现 class 转换异常。在记录它正在发送消息后,将消息丢在地板上

我应该使用其他发送任务处理程序吗?是否有另一种方法 return 比 JBPM 实际支持的流程中的字符串更复杂的东西?

发送消息事件是以抽象的方式定义的,BPMN2规范并没有明确定义它的含义,例如发送电子邮件、即时消息、Web应用程序中的通知等。因此,我们提供一个可插入的实现,您可以在其中使用处理程序插入您自己的实现。

当您说 'return something' 时,您能否说明您的用例是什么,您期望它做什么?除了使用消息事件,您还可以使用特定于领域的任务来精确建模您想要的内容,例如发送电子邮件、推文等。