3.7. データ

プロセスの実行中に、データを取得、格納、次に渡す、使用することができます。ランタイムデータをプロセスの実行時に格納するには、プロセス変数を使用します。変数は、名前とデータ型で定義します。基本的なデータ型には、Boolean、Int、String や様々な種類のオブジェクトサブクラスなどが含まれます。
変数は、変数のスコープ内で定義できます。プロセス自体の変数スコープがトップレベルのスコープとなります。サブスコープはサブプロセスを使用して定義できます。サブスコープで定義されている変数は、そのスコープ内のノードに対してのみアクセスできます。
変数にアクセスするたびに、プロセスは、その変数を定義する適切な変数スコープを検索します。ノードは常に親コンテナーにある変数を検索します。変数が見つからない場合は、ノードはプロセスインスタンス自体に到達するまで、親の親のコンテナーというように上位のコンテナーを検索します。変数が見つからない場合は、読み取りアクセスは null と出して、書き込みアクセスはエラーメッセージを生成します。これは、プロセス実行時に並行して行われています。
変数は以下のような方法で利用できます。
  • プロセスレベルの変数は、startProcess メソッドの呼び出すへパラメーターをマッピングすることで、プロセス開始時に設定できます。これらのパラメーターは、プロセススコープで変数として設定されます。
  • スクリプトアクションは、単にスクリプト内のローカルパラメーターとして変数の名前を使用することで、直接変数にアクセスできます。例えば、プロセスがそのプロセス内で "org.jbpm.Person" 型の変数を定義する場合、プロセス内のスクリプトは以下のように直接これにアクセスすることも可能です。
    // call method on the process variable "person"
    
    person.setAge(10);
    ナレッジコンテキストで、スクリプト内の変数の値を変更することが可能です。
    kcontext.setVariable(variableName, value);
  • サービスタスク (および再利用可能なサブプロセス) は、変数を外向きのパラメーターにマッピングすることで、外部 (または別のプロセスインスタンス) にプロセス変数の値を渡すことができます。例えば、サービスタスクのパラメーターマッピングは、プロセス変数 x の値はサービスが呼び出されrう直線にタスクパラメーター y にマッピングするべきであることを定義することができます。また、プロセス変数の値をハードコード化されたパラメーター文字列に #{expression} を使用することで注入することができます。例えばヒューマンタスクの説明は以下のように定義することができます。
    You need to contact person #{person.getName()}
    
    人がプロセス変数の場合。サービスを呼び出す必要がある場合、この式は実際の人の名前で置き換えられます。またサービス (または再利用可能なサブプロセス) のよく似た結果は、結果マッピングを使用して変数にコピーし直すことができます。
  • その他の様々なノードもデータにアクセスすることができます。例えば、イベントノードはイベントに関連付けられているデータを変数に格納することができます。詳細については、各種ノードタイプのプロパティを確認してください。
最後に、プロセス (およびルール) はグローバル変数 (グローバルに定義された変数とナレッジセッションのデータ) にアクセスすることができます。グローバル変数は変数のようにアクション内で直接アクセスすることができます。グローバル変数はプロセスの一部と定義しなければ利用することができません。以下を使用することでグローバル変数を設定することができます。
ksession.setGlobal(name, value)
グローバル変数は、以下を使用してプロセススクリプト内から設定することができます。
kcontext.getKnowledgeRuntime().setGlobal(name,value);.