jBPM5:Human taskからの分岐

渡邊です。こんにちは。

久しぶりにjBPM5の研究を再開しました。
「Human taskからの分岐」の実現方法に関する備忘録です。研究中につき、jBPM5開発者が意図した方式であるかは不明です。

まずは次のフロー図をご覧ください。

次のようなことを実現したいとします。

  • Judgmentタスクは、Human taskです。
  • 同タスクをアサインされたユーザは、(タスクに紐ずく業務データを確認するなどをした後)承認または否認します。
  • 承認が選択された場合、プロセスはAcceptと記された経路に進みます。
  • 否認が選択された場合、プロセスはRejectと記された経路に進みます。
  • ダイアグラム全体の設定
    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);

    コメントを残す

    メールアドレスが公開されることはありません。 * が付いている欄は必須項目です