Activiti BPMN について 2 つの質問があります。
1) メッセージ定義をプログラムで解析するにはどうすればよいですか
2)intermediateThrowEvent イベントをプログラムでトラップするにはどうすればよいですか。
組み込みの Activiti BPMN エンジン (現在のバージョンは 5.11) を使用するプロジェクトに取り組んでいます。アプリケーションは現在、JMS メッセージの送受信によって駆動されており、それらを Activiti メッセージおよびシグナルとして公開するのが自然に適合すると考えました。アプリケーションは、それぞれが単一の BPMN エンジンを実行し、さまざまなプロセスを実行する多数の個別の JVM を有効にして、相互にメッセージを送受信できるようにする必要があります。
各シナリオの実装方法についていくつか考えがありますが、BPMN プロセスからのメッセージを解析してオプション 2a を実装する方法がわかりません。また、intermediateThrowEvent をトラップしてオプション 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 - アクティビティ メッセージ名またはアクティビティ シグナル名に直接マップされる動的トピックにサブスクライブします。ここで注意が必要なのは、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>
アイデアをお寄せいただきありがとうございます。