我有两个关于 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>
提前感谢您的任何想法。