【Activiti Tips】実行中のプロセスインスタンスが参照するプロセス定義を差し替える
概要
今回の記事では、誤って不具合を含んだプロセス定義をリリースして運用を始めてしまった場合に、稼働中のプロセスインスタンスの参照するプロセス定義を変更する2つの方法を紹介します。
1つ目の方法は、不具合を修正したプロセス定義を作成し、再度デプロイを実施することです。 もう一つの方法は、すでにサーバ上にデプロイされた不具合を含んだプロセス定義を直接編集する方法です。
修正したプロセス定義の再デプロイ
Activitiの内部コマンド SetProcessDefinitionVersionCmdを利用して、プロセスインスタンスが参照しているプロセス定義のバージョンを変更することが可能です。 不具合を修正したプロセス定義をデプロイし、SetProcessDefinitionVersionCmdを利用して既存のプロセスインスタンスが再デプロイしたプロセス定義を参照するようにします。
ステップ
修正したプロセス定義をデプロイします
不具合を修正したプロセス定義をデプロイし、デプロイ後のバージョンを確認します。
SetProcessDefinitionVersionCmdの実行
SetProcessDefinitionVersionCmdを利用して既存のプロセスインスタンスが参照するプロセス定義を、ステップ1でデプロイされたバージョンに差し替えます。SetProcessDefinitionVersionCmdには対象となるプロセスインスタンスのIDと差し替え対象のプロセス定義のバージョンを指定します。
((ProcessEngineConfigurationImpl) processEngine.getProcessEngineConfiguration()).getCommandExecutor().
execute(
new SetProcessDefinitionVersionCmd(processInstanceId, processDefinitionVersion)
);
プロセス定義の直接変更
ActivitiのAPI DynamicBpmnServiceを利用し、既存のプロセスインスタンスが参照するプロセス定義を直接書き換えます。
ステップ
- DynamicBpmnServiceのchange〜メソッドを利用して、変更内容を表すObjectNodeを作成します。
// シーケンスの分岐条件の内容を変更しています。 ObjectNode changedNode = processEngine.getDynamicBpmnService().changeSequenceFlowCondition("flow4", "${input == 'aaa'}");
- DynamicBpmnServiceのsaveProcessDefinitionInfoメソッドを利用して、変更内容をプロセス定義へ反映します。
processEngine.getDynamicBpmnService().saveProcessDefinitionInfo(processInstance.getProcessDefinitionId(), changedNode);
サンプルプログラム
SetProcessDefinitionVersionCmd, DynamicBpmnServiceそれぞれを利用したサンプルプログラムを以下のリポジトリで公開しています。
https://github.com/daisuke-yoshimoto/process_def_migration_sample
上記のリポジトリのサンプルコードはシンプルさを重視しています。 実際の開発・運用において必ずしも適切な実装ではありません。参考にされる場合は、十分ご注意ください。