8.5. タスクコントローラ

タスクインスタンス作成時、 タスクコントローラを使い、タスクインスタンス変数の生成が可能です。また、タスクインスタンス終了時、タスクコントローラを使いそれに所属するデータをプロセス変数へサブミットできます。

注記

タスクコントローラの利用は任意です。タスクインスタンスは、そのトークンと関係のあるプロセス変数を「参照する」ことができます。タスクコントローラは以下のタスクを実行する際に利用してください。
  • 中間のタスクインスタンス変数の更新によりプロセスが完了するまでにプロセス変数へ影響を与えないように、タスクインスタンス変数のコピーを作成します。この時、これらのコピーは再度プロセス変数にサブミットされます。
  • タスクインスタンス変数は、プロセス変数に対して1対1の関係を持ちません。 例えば、プロセスにsales in Januarysales in Februarysales in March の変数があれば、タスクインスタンスのフォームは、この3カ月間の平均売上高を表示する必要があるかもしれません。
タスクはユーザからの入力を集めようとします。 しかし、タスクをユーザにみせるために利用可能なユーザインターフェースは、たくさんあります。 例えば、webアプリケーション、swingアプリケーション、インスタントメッセンジャー、 eメールフォームなど。そのため、タスクコントローラは、プロセス変数(=プロセスコンテキスト)とユーザインターフェースの橋渡しをします。 タスクコントローラは、ユーザインターフェースアプリケーションにプロセス変数のビューを提供します。
タスクインスタンス作成時にタスクコントローラは、プロセス変数があればそれをタスク変数に変換します。タスク変数は、ユーザインターフェースフォームの入力として取り扱われます。ユーザ入力自体は、タスク変数に保存されます。ユーザがタスクを終了するとき、タスクコントローラは、 タスクインスタンスのデータをもとに、プロセス変数の更新を行います。
タスクコントローラ

図8.2 タスクコントローラ

簡単なシナリオですと、プロセス変数とフォームパラメーターの間で1対1マッピングがあるとします。task要素でタスクコントローラーを指定します。この場合、デフォルトの JBPM タスクコントローラを利用でき、タスク変数にプロセス変数をコピーする方法を記述したvariable 要素のリストを取得します。
次の例は、プロセス変数に基づいて、 どのように別々のタスクインスタンス変数のコピーを作成するかを示しています。
<task name="clean ceiling">
  <controller>
    <variable name="a" access="read" mapped-name="x" />
    <variable name="b" access="read,write,required" mapped-name="y" />
    <variable name="c" access="read,write" />
  </controller>
</task>
name属性は、プロセス変数の名前をさしています。 mapped-name は、任意設定で、タスクインスタンス変数の名前をさしています。mapped-name 属性が省略された場合、mapped-nameの名前をデフォルトにします。 mapped-name は、webアプリケーションのタスクインスタンスにあるフィールドのラベルとしても利用できるということに注意してください。
access 属性を使い、タスクインスタンス作成時に変数をコピーするか、またタスクインスタンス終了時にプロセス変数を書き直すかどうか指定します (この情報を使い、ユーザーインターフェースが正しいフォーム制御を生成できるようにします)。 access 属性は任意設定であり、 デフォルトのアクセス権は read,writeです。
A task-node は多くのタスクを持つことができ、start-stateは 1 つのタスクを持つことができます。
プロセス変数とフォームパラメータ間の簡単な 1 対 1 のマッピングに制限が過剰となってきた場合、カスタムの TaskControllerHandler 実装を作成してください。以下がこのインターフェースです:
public interface TaskControllerHandler extends Serializable {
  void initializeTaskVariables(TaskInstance taskInstance, ContextInstance contextInstance, Token token);
  void submitTaskVariables(TaskInstance taskInstance, ContextInstance contextInstance, Token token);
}
このコード例はマップの設定方法を表しています。
<task name="clean ceiling">
  <controller class="com.yourcom.CleanCeilingTaskControllerHandler">
    -- here goes your task controller handler configuration --
  </controller>
</task>