第7章 コンテキスト
この章では プロセス変数 について説明します。プロセス変数は、プロセスインスタンス関連の情報を保持するキーと値のペアです。
注記
コンテキスト をデータベースに保存できるようにするために、いくつかの小さな制限が適用されます。
7.1. プロセス変数へのアクセス リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
org.jbpm.context.exe.ContextInstance
は、プロセス変数の中心的なインターフェイスとして機能します。次の方法で、プロセスインスタンスから ContextInstance
を取得します。
ProcessInstance processInstance = ...; ContextInstance contextInstance = (ContextInstance) processInstance.getInstance(ContextInstance.class);
ProcessInstance processInstance = ...;
ContextInstance contextInstance =
(ContextInstance) processInstance.getInstance(ContextInstance.class);
基本的な操作は次のとおりです。
変数名は
java.lang.String
です。デフォルトでは、Business Process Manager は次の値の型をサポートしています。(Hibernate で永続化できる他の型もサポートしています。)
java.lang.String | java.lang.Boolean |
java.lang.Character | java.lang.Float |
java.lang.Double | java.lang.Long |
java.lang.Byte | java.lang.Integer |
java.util.Date | byte[] |
java.io.Serializable |
注記
型指定のない null 値 も永続的に格納できます。
警告
プロセス変数に他の型が格納されている場合は、プロセスインスタンスを保存しないでください。例外エラーが発生します。
7.2. 変数の寿命 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
プロセスアーカイブで変数を宣言する必要はありません。ランタイム時に、任意の Java オブジェクトを変数に格納します。変数が存在しない場合は、単純な
java.util.Map
と同じ方法で作成されます。また、変数は削除することもできます。
ContextInstance.deleteVariable(String variableName); ContextInstance.deleteVariable(String variableName, Token token);
ContextInstance.deleteVariable(String variableName);
ContextInstance.deleteVariable(String variableName, Token token);
型は自動的に変更できます。これは、異なる型の値の変数を型で上書きできることを意味します。単純な列の更新よりも多くのデータベースとの通信が発生するため、型の変更の数は、常に制限することが重要です。
7.3. 可変永続性 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
変数はプロセスインスタンスの一部です。プロセスインスタンスをデータベースに保存すると、データベースがプロセスインスタンスと同期されます。(これにより、変数が作成、更新、および削除されます。) 詳細は、4章 永続性 を参照してください。
7.4. 可変スコープ リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
各実行パス (トークン とも呼ばれます) には、独自のプロセス変数のセットがあります。変数は常に実行パスで要求されます。プロセスインスタンスには、これらのパスのツリーがあります。変数が要求されたときにパスが指定されていない場合、
ルートトークン
がデフォルトで使用されます。
変数の検索は再帰的に行われます。検索は、特定の実行パスの親で実行されます。(これは、プログラミング言語で変数のスコープを設定する方法に似ています。)
存在しない変数が実行パスに設定されると、その変数は
ルートトークン
に作成されます。(そのため、各変数にはデフォルトでプロセススコープがあります。) 変数トークンを "ローカル" にするには、次の例に従って明示的に作成します。
ContextInstance.createVariable(String name, Object value, Token token);
ContextInstance.createVariable(String name, Object value, Token token);
7.4.1. 変数のオーバーロード リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
変数のオーバーロード とは、各実行パスが同じ名前の変数の独自のコピーを持つことができることを意味します。これらのコピーはすべて別々に扱われ、異なる型を取ることができます。変数のオーバーロードは、同じ遷移で複数の同時実行パスを起動する場合に有用なことがあります。これらのパスを区別するのは、それぞれの変数のセットだけであるからです。
7.4.2. 変数のオーバーライド リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
変数のオーバーライド とは、ネストされた実行パス 内の変数が、よりグローバルな実行パス内の変数をオーバーライドすることを意味します。一般に、"ネストされた実行パス" は同時実行に関連しています。フォークとジョインの間の実行パスは、フォークに到達した (ネストされた) 実行パスの子です。たとえば、プロセスインスタンススコープ内の
contact
という名前の変数を、ネストされた実行パス shipping
および billing
内のこの変数でオーバーライドできます。
7.4.3. タスクインスタンス変数のスコープ リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
タスクインスタンス変数については、「 タスクインスタンス変数 」 を参照してください。
7.5. 一時変数 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
プロセスインスタンスがデータベースに永続化されると、通常の変数も永続化されます。しかし、変数をデータベースに格納せずに委譲クラスで使用する必要がある場合もあります。これは、一時変数 を使用して実現できます。
注記
一時変数の寿命は、
ProcessInstance
Java オブジェクトの寿命と同じです。
注記
その性質上、一時変数は実行パスとは関係ありません。そのため、プロセスインスタンスオブジェクトには、それらのマップが 1 つしかありません。
一時変数には、コンテキストインスタンス内の独自のメソッドセットを介してアクセスできます。
processdefinition.xml
ファイルで宣言する必要はありません。
Object ContextInstance.getTransientVariable(String name); void ContextInstance.setTransientVariable(String name, Object value);
Object ContextInstance.getTransientVariable(String name);
void ContextInstance.setTransientVariable(String name, Object value);
この章では、プロセス変数について詳しく説明しました。これで、このトピックの理解に自信を持てるはずです。