У меня есть два вопроса о Activiti BPMN:
1) Как программно анализировать определения сообщений
2) Как программно перехватывать события IntermediateThrowEvent.
Я работаю над проектом, в котором будет использоваться встроенный механизм Activiti BPMN (в настоящее время версия 5.11). В настоящее время приложение управляется отправкой и получением сообщений JMS, и я подумал, что было бы естественным представить их как сообщения и сигналы Activiti. Приложение должно включать множество отдельных JVM, каждая из которых работает с одним механизмом BPMN с различными процессами для отправки и получения сообщений друг от друга.
У меня есть несколько мыслей о том, как реализовать каждый сценарий, но я не уверен, как анализировать сообщения из моего процесса BPMN для реализации варианта 2a, и я не уверен, как перехватить middleThrowEvent для реализации варианта 1b:
а) Получение сообщений:
Вариант 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);
}
Вариант 2а. Подпишитесь на динамическую тему, которая напрямую соответствует имени сообщения Activiti или имени сигнала активности. Сложность здесь заключается в том, как проанализировать сообщение или имя сигнала из процесса BPMN. Мне удалось проанализировать ссылку на сообщение с помощью пользовательского BpmnParseListener, но я могу получить только ссылку на сообщение, а не имя сообщения из реализации.
pec = ProcessEngineConfiguration.createStandaloneProcessEngineConfiguration();
if (pec instanceof ProcessEngineConfigurationImpl)
{
List<BpmnParseListener> preParseListeners = new ArrayList <>();
preParseListeners.add(new BPMNMessageAndSignalParser(pontus));
((ProcessEngineConfigurationImpl) pec).setCustomPreBPMNParseListeners(preParseListeners );
}
б) Отправка сообщений:
Вариант 1b) Я хотел бы в идеале перехватить IntermediateThrowEvent, чтобы я мог отправить сигнал в виде сообщения 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>
Заранее спасибо за любые идеи.