3.11. プロセスインスタンスの移行

プロセスインスタンスには、後ほど実行を継続するのに必要なランタイムの情報がすべて含まれています。これは、このプロセスインスタンス (変数など) にリンクされたデータや、プロセス図の現在のステータスも含まれています。現在アクティブなノードごとに、ノードインスタナスにはノードのステータスが含まれています。このノードインスタンスには、そのノードの実行に関連付けられた追加のステータス情報も含まれています。ノードに 1 つずつ違った種類のノードインスタンスがあります。
プロセスインスタンスには、ランタイムのステータスのみが含まれており、このプロセスインスタンスの実行時に従うべきプロセスロジックを指す特定のプロセスに関連付けられています (間接的に ID 参照を使用して)。定義やランタイムのステータスを明確に区別することで、このプロセスをベースとして全プロセスインスタンスの間で定義を再利用でき、ランタイムのステータスを最小限に抑えることができます。結果、実行中のプロセスインスタンスを新しいバージョンに更新して古いプロセスロジックではなく新しいものを使用するのは、参照するプロセス ID を古いものから新しいものに変えるだけです。
しかし、これには、プロセスインスタンスのステータス (変数インスタンスとノードインスタンス) が含まれておらず、プロセスインスタンスも移行する必要がある場合もあります。プロセスのみが延長され、既存の待機ステータスがすべて保持された場合、プロセスインスタンスのランタイムステータスは変更する必要はありません。ただし、より精緻なマッピングが必要になる可能性もあります。例えば、既存の待機ステータスが削除され複数の待機ステータスに分割された場合、待機ステータスにある既存のプロセスインスタンスは簡単に更新できません。しかし、新しいプロセス変数が利用されると、変数は、残りの更新プロセスで利用できるように、正しく初期化する必要がある場合もあります。
WorkflowProcessInstanceUpgrader を使用して、ワークフロープロセスインスタンスを新しいプロセスインスタンスにアップグレードすることができます。プロセスインスタンスには新しいプロセス ID が渡されます。デフォルトでは、古いノードインスタンスが自動的に新しいノードインスタンスに同じ ID のままでマッピングされます。しかし、古い (一意の) ノード ID から新しいノード ID へのマッピングを提供することができます。親のノード ID の後に (コロンで区切り) このノード ID を置くと一意のノード ID となり、複合ノードが使用された場合にノードを識別することができます (ノード ID はノードコンテナーの中でのみ一意であるため)。新しいノード ID はノードコンテナーの中だけで新しいノード ID となっており、一意のノード ID への参照は必要ありません。以下のコードスニペットは一例となっています。
// create the session and start the process "com.sample.process"
KnowledgeBuilder kbuilder = ...
StatefulKnowledgeSession ksession = ...
ProcessInstance processInstance = ksession.startProcess("com.sample.process");

// add a new version of the process "com.sample.process2"
kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
kbuilder.add(..., ResourceType.BPMN2);
kbase.addKnowledgePackages(kbuilder.getKnowledgePackages());

// migrate process instance to new version
Map<String, Long> mapping = new HashMap<String, Long>();
// top level node 2 is mapped to a new node with id 3
mapping.put("2", 3L); 
// node 2, which is part of composite node 5, is mapped to a new node with id 4
mapping.put("5.2", 4L); 
WorkflowProcessInstanceUpgrader.upgradeProcessInstance(
   ksession, processInstance.getId(),
   "com.sample.process2", mapping);
このようなマッピングで不十分な場合、個別の状況に対して独自のカスタムパッマーを記述することができます。まず、プロセスインスタンスを切断して、ステータスを随時変更してから、プロセスインスタンスを再接続します。これは、WorkflowProcessinstanceUpgrader が行うこととよく似ています。