渡邊です。こんにちは。
久しぶりにjBPM5の研究を再開しました。
「Human taskからの分岐」の実現方法に関する備忘録です。研究中につき、jBPM5開発者が意図した方式であるかは不明です。
まずは次のフロー図をご覧ください。
次のようなことを実現したいとします。
ダイアグラム全体の設定
BPMN Diagram全体のプロパティを開き、「プロパティ詳細 > Variable Definitions」を選択し、次の設定を追加します。
Name | Standard Type | Custom Type |
---|---|---|
outcome | String |
Judgmentタスクの設定
Judgmentタスクのプロパティを開き、「プロパティ詳細 > DataOutputSet」を選択し、次の設定を追加します。
Name | Standard Type | Custom Type |
---|---|---|
outcome | String |
同じくJudgmentタスクのプロパティを開き、「プロパティ詳細 > Assignments」を選択し、次の設定を追加します。
From Object | Assignment Type | To Object | To Value |
---|---|---|---|
outcome(DataOutputSet) | is mapped to | outcome(Variable Definitions) |
Acceptコネクションの設定
Acceptコネクション(矢印)のプロパティを開き、「プロパティ詳細 > Condition Expression」を選択し、次のコードを記述します。
return "accept".equals(outcome);
Rejectコネクションの設定
Rejectコネクション(矢印)のプロパティを開き、「プロパティ詳細 > Condition Expression」を選択し、次のコードを記述します。
return "reject".equals(outcome);
ここからはロジックに関する記述です。
taskServicとtaskSummaryは、それぞれorg.jbpm.task.TaskServiceとorg.jbpm.task.query.TaskSummarのインスタンスです。
taskSummaryは、actorIdで特定されるユーザにアサインされたJudgmentタスクとします。
詳細は割愛します。
承認ロジック
ユーザが、Judgmentタスクにおいて承認と判断した時のロジックです。
taskService.start(taskSummary.getId(), actorId); Map results = new HashMap(); results.put("outcome", "accept"); taskService.completeWithResults(taskSummary.getId(), actorId, results);
否認ロジック
ユーザが、Judgmentタスクにおいて否認と判断した時のロジックです。
taskService.start(taskSummary.getId(), actorId); Map results = new HashMap(); results.put("outcome", "reject"); taskService.completeWithResults(taskSummary.getId(), actorId, results);
おまけ
どこかに間違いがあると、承認または否認実行時において次のようなエラーメッセージが出力されます
XOR split could not find at least one valid outgoing connection for split Gateway
これは、Getwayからどの経路にも進めいないためです。変数「outcome」がnullになっていることがほとんどです。
トラブルシューティングの際は、当該Getwayから第3の経路を引き、Scriptタスクへと接続します。
ScriptタスクのScriptプロパティに次のように記します。
System.out.println("bad outcome : " + outcome);