2)プロセス定義ファイルの作成
「1.開発対象のアプリケーションについて」の章で説明したワークフローを、「Activiti Designer(プロセスモデリングツール)」を使って描いてみましょう。
Activiti Designerの基本的な使い方については、『オープンソースのワークフローエンジン「Activiti」入門』参照してください。
src/main/resources/bpmn配下にプロセス定義ファイルを作成しますので、bpmnパッケージを右クリックし、下図のように[新規]-[その他]を選択してください。
下図のように「Activiti Diagram」を選択してください。
下図のようにファイル名は「transportation.bpmn」としてください。
下図のように「No, just create an empty diagram」を選択してください。
以下のように、プロセスフローを完成させてください。
プロセスフロー全体のIdプロパティに「transportation」を設定してください。
余白部分(白い部分)をクリックすると、プロセスフロー全体のプロパティビューを表示することができます。
| Idプロパティ |
プロセスフローを一意に特定するためのIDを設定します。 どのプロセスフローをもとにプロセスを開始するのかを指定する際に使います。 |
|---|
プロセスフロー上の各要素に関するプロパティ設定は、下図を参考に設定してください(各要素をクリックすると、その要素のプロパティビューを表示することができます)。
|
Assignee プロパティ |
タスクを実行できるユーザーを設定します。 ${generalAffairsId}という記述は、「プロセス開始時にgeneralAffairsIdという変数で 動的にタスクを実行できるユーザーを割り当てること」を意味します。 |
|---|---|
|
条件 プロパティ |
シーケンスフローの通過条件を設定します。 ${flowCtrl=='APPROVE'}という記述は、 「タスク完了時にflowCtrlという変数の値が"APPROVE"の場合、 このシーケンスフローに流れること」を意味します。 |
3)プロセス定義ファイルのデプロイ
「Activiti Designer」で作成した「プロセス定義ファイル」をアプリケーション実行時に利用するためには、事前にActiviti側のテーブルへ登録しておく必要があります。
transportationプロジェクトに含まれるデプロイツール(DeploymentProcDef)を実行してください。
DeploymentProcDef.javaを右クリックし、[実行]-[Javaアプリケーション]を選択します。
デプロイが成功すると、コンソールへ以下のようなメッセージが表示されます。
デプロイは、何度実行しても構いません。
- デフォルトでは、最後にデプロイしたプロセス定義ファイルが利用されます。
- バージョンを指定することで、以前にデプロイしたプロセス定義ファイルをもとにプロセスを開始することも可能です。
4)交通費申請入力画面:[申請]ボタン押下処理の実装
入力された交通費申請データをDBに登録する処理は、すでに実装されていますが、ActivitiのAPIを使ってプロセスを開始する処理は、実装されていません。
tutorial.action.paperwork.TransportationInputAction#doApplyメソッド内を以下のようにコーディングしてください。
// ----------------------------------------------------------------------
// TODO ActivitiのAPIを使ってプロセスを開始する処理を実装してください。
// ----------------------------------------------------------------------
// [STEP1] 本申請の「庶務担当者」「マネージャー」を設定します。
Map<String, Object> variableMap = new HashMap<String, Object>();
variableMap.put("generalAffairsId", "messi"); // 庶務担当者
variableMap.put("managerId", "xavi"); // マネージャー
// [STEP2] 交通費申請IDをbusinessKeyとして、
// プロセスを開始します。
runtimeService.startProcessInstanceByKey(
"transportation",
Long.toString(transportation.transportationId),
variableMap);
// ----------------------------------------------------------------------
// ここまで
// ----------------------------------------------------------------------
コードの解説
[STEP1]
ワークフロー上の「庶務確認」「マネージャー承認」タスクの実行者に割り当てるユーザーIDをMapに格納しています。
プロセス定義ファイルを作成した際、タスクのAssigneeプロパティに「${generalAffairsId}」と「${managerId}」を設定しましたが、このAssigneeへ割り当てるユーザーIDをこのMapで設定しています。
[STEP2]
runtimeService(ActivitiのAPI)を使用して、プロセスを開始する処理を実装しています。
- startProcessInstanceByKeyメソッドの第1引数は、「プロセス定義ファイルのID」です。
- 第2引数は、「アプリケーション側のデータを一意に特定するためのキー(交通費申請ID)」を渡しています。
- 第3引数は、[STEP1]で設定したMapを渡しています。
Activiti APIの仕様は、Activiti - Engine 5.13 APIのサイトを参照ください。
「アプリケーション側の申請データ」と「ワークフローエンジン側のデータ」を紐付けるためには、どちらかが相手のキーを保持する必要があります。
どちらがキーを保持するかは、利用するワークフローエンジンによって異なります。
Activitiは、ACT_HI_PROCINSTテーブルに"BUSINESS_KEY_"というカラムがあり、ここでアプリケーション側のキーを保持しています。





