2

我有两个关于 Activiti BPMN 的问题:

1)如何以编程方式解析消息定义

2) 我如何以编程方式捕获intermediateThrowEvent 事件。

我正在开发一个将使用嵌入式 Activiti BPMN 引擎(当前版本为 5.11)的项目。该应用程序当前由发送和接收 JMS 消息驱动,我认为将它们公开为 Activiti 消息和信号是很自然的。该应用程序必须启用许多单独的 JVM,每个 JVM 运行一个具有各种进程的单个 BPMN 引擎,以便在彼此之间发送和接收消息。

我对如何实现每个场景有一些想法,但我不确定如何解析来自我的 BPMN 流程的消息以实现选项 2a,并且我不确定如何捕获 middleThrowEvent 以实现选项 1b:

a) 接收消息:

选项 1a - 订阅所有 JMS 消息到达的单个主题,并将 Activiti 消息或 Activiti 信号名称作为有效负载放入 JMS 消息中。当 JMS 消息到达时,我可以查询每个引擎以查看哪些当前执行正在订阅消息,以及哪些进程需要启动:

List<ProcessDefinition> pds= repositoryService.createProcessDefinitionQuery()
  .messageEventSubscription("messageNameInsideJMSPayload")
  .list();

for (ProcessDefinition pd: pds) 
{
    RunBPMProcess.runtimeService.startProcessInstanceByMessage(messageName, 
    di.getId().toString(), processVariables);
}

选项 2a - 订阅直接映射到 Activiti 消息名称或活动信号名称的动态主题。这里棘手的部分是如何解析来自 BPMN 流程的消息或信号名称。我已经设法通过使用自定义 BpmnParseListener 来解析消息引用,但我只能从实现中获取消息引用,而不是消息名称。

pec = ProcessEngineConfiguration.createStandaloneProcessEngineConfiguration();
  if (pec instanceof ProcessEngineConfigurationImpl)
  {

    List<BpmnParseListener> preParseListeners = new ArrayList <>();

    preParseListeners.add(new BPMNMessageAndSignalParser(pontus));


    ((ProcessEngineConfigurationImpl) pec).setCustomPreBPMNParseListeners(preParseListeners );


  }

b) 发送消息:

选项 1b) 我想理想地捕获中间ThrowEvent,因此我可以将信号作为 JMS 消息发送,但我不知道该怎么做。

我对 Activiti 还很陌生,如果我遗漏了任何明显的东西,我深表歉意;此外,这是一个示例工作流程,只是为了帮助将问题置于上下文中:

<?xml version="1.0" encoding="UTF-8" ?>
<definitions id="definitions"
             targetNamespace="http://activiti.org/bpmn20" 
             xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xmlns:activiti="http://activiti.org/bpmn">
  <message id="pontusMessage" name="pontusMessage"/>
  <signal id = "pontusSignal" name="pontusSignal"/>
  <process id="test" name="PontusNetworks Test"  isExecutable="true">

    <startEvent id="start"/>

    <sequenceFlow id="flow1" sourceRef="start" targetRef="messageReceiver" />

    <intermediateCatchEvent id="messageReceiver">
        <messageEventDefinition messageRef="pontusMessage" />
    </intermediateCatchEvent>

    <sequenceFlow id="flow2" sourceRef="messageReceiver" targetRef="signalSender">
    </sequenceFlow>


    <intermediateThrowEvent id="signalSender">
        <signalEventDefinition signalRef="pontusSignal" />
    </intermediateThrowEvent>
    <sequenceFlow id="flow3" sourceRef="messageReceiver" targetRef="theEnd2"/>

    <endEvent id="theEnd2" />

  </process>

</definitions>

提前感谢您的任何想法。

4

1 回答 1

2

如何以编程方式解析消息定义

我不确定这是什么意思,但显然 Activiti 在解析 BPMN 流程定义 XML 时确实具有通知机制。它允许插入一个侦听器,该侦听器将在多个事件中得到通知。

为此写了一篇有趣的文章。当然,通知中心是我们真正希望在未来版本中看到的。

于 2012-12-22T18:26:44.977 回答