BRMS ビジネスプロセス管理ガイド
JBoss 開発者およびルール作成者向け
エディッション 5.3.1
Red Hat Content Services
概要
前書き
第1章 はじめに
1.1. はじめに

図1.1 プロセス例
- ビジネスプロセスの作成や編集を行うための JBoss BRMS ユーザーインターフェースに埋め込まれたグラフィカルエディター
- ビジネスプロセスの作成や編集を行うための JBoss Developer Studio 向けのグラフィカルエディタープラグイン
- プロセスの監視、ヒューマンタスク管理、レポート追加機能を提供する管理コンソール
- プロセスの保存、バージョニング、管理を行うために JBoss BRMS リポジトリと統合
- 外部のヒューマンタスクサービスと統合
第2章 ビジネスプロセス管理 API
2.1. API

図2.1 ナレッジベースとナレッジセッション
- プロセス定義を含むナレッジベースの作成
- 新規プロセスインスタンスの開始、既存プロセスインスタンスのシグナル、リスナーの登録を行えるようにセッションを作成
2.2. ナレッジベースの作成
KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder(); kbuilder.add(ResourceFactory.newClassPathResource("MyProcess.bpmn"), ResourceType.BPMN2); KnowledgeBase kbase = kbuilder.newKnowledgeBase();
ResourceFactory
には、ファイルシステム、URL、InputStream、Reader からファイルをロードするよく似たメソッドが含まれています。
2.3. セッションの作成
StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession(); ProcessInstance processInstance = ksession.startProcess("com.sample.MyProcess");
ProcessRuntime
インターフェースは、例2.1「ProcessRuntime インターフェース」 に記載されているように、プロセスと対話するセッションメソッドすべてを定義します。
例2.1 ProcessRuntime インターフェース
/** * Start a new process instance. The process (definition) that should * be used is referenced by the given process id. * * @param processId The id of the process that should be started * @return theProcessInstance
that represents the instance of the process that was started */ ProcessInstance startProcess(String processId); /** * Start a new process instance. The process (definition) that should * be used is referenced by the given process id. Parameters can be passed * to the process instance (as name-value pairs), and these will be set * as variables of the process instance. * * @param processId the id of the process that should be started * @param parameters the process variables that should be set when starting the process instance * @return theProcessInstance
that represents the instance of the process that was started */ ProcessInstance startProcess(String processId, Map<String, Object> parameters); /** * Signals the engine that an event has occurred. The type parameter defines * which type of event and the event parameter can contain additional information * related to the event. All process instances that are listening to this type * of (external) event will be notified. For performance reasons, this type of event * signaling should only be used if one process instance should be able to notify * other process instances. For internal event within one process instance, use the * signalEvent method that also include the processInstanceId of the process instance * in question. * * @param type the type of event * @param event the data associated with this event */ void signalEvent(String type, Object event); /** * Signals the process instance that an event has occurred. The type parameter defines * which type of event and the event parameter can contain additional information * related to the event. All node instances inside the given process instance that * are listening to this type of (internal) event will be notified. Note that the event * will only be processed inside the given process instance. All other process instances * waiting for this type of event will not be notified. * * @param type the type of event * @param event the data associated with this event * @param processInstanceId the id of the process instance that should be signaled */ void signalEvent(String type, Object event, long processInstanceId); /** * Returns a collection of currently active process instances. Note that only process * instances that are currently loaded and active inside the engine will be returned. * When using persistence, it is likely not all running process instances will be loaded * as their state will be stored persistently. It is recommended not to use this * method to collect information about the state of your process instances but to use * a history log for that purpose. * * @return a collection of process instances currently active in the session */ Collection<ProcessInstance> getProcessInstances(); /** * Returns the process instance with the given id. Note that only active process instances * will be returned. If a process instance has been completed already, this method will return * null. * * @param id the id of the process instance * @return the process instance with the given id or null if it cannot be found */ ProcessInstance getProcessInstance(long processInstanceId); /** * Aborts the process instance with the given id. If the process instance has been completed * (or aborted), or the process instance cannot be found, this method will throw an * IllegalArgumentException. * * @param id the id of the process instance */ void abortProcessInstance(long processInstanceId); /** * Returns the WorkItemManager related to this session. This can be used to * register new WorkItemHandlers or to complete (or abort) WorkItems. * * @return the WorkItemManager related to this session */ WorkItemManager getWorkItemManager();
2.4. イベントリスナー
ProcessEventListener
を使用して、プロセスの開始や完了、ノードの出入りなど、プロセス関連のイベントをリッスンすることができます。ProcessEventListener
クラスの様々なメソッドが以下の例で示されています。イベントオブジェクトは、プロセスインスタンスやイベント関連するノードインスタンスなど関連の情報にアクセスできるようにします。この API を使用してイベントリスナーを登録することができます。
例2.2 ProcessEventListener クラス
public interface ProcessEventListener { void beforeProcessStarted( ProcessStartedEvent event ); void afterProcessStarted( ProcessStartedEvent event ); void beforeProcessCompleted( ProcessCompletedEvent event ); void afterProcessCompleted( ProcessCompletedEvent event ); void beforeNodeTriggered( ProcessNodeTriggeredEvent event ); void afterNodeTriggered( ProcessNodeTriggeredEvent event ); void beforeNodeLeft( ProcessNodeLeftEvent event ); void afterNodeLeft( ProcessNodeLeftEvent event ); void beforeVariableChanged(ProcessVariableChangedEvent event); void afterVariableChanged(ProcessVariableChangedEvent event); }
表2.1 サポートされているロガー
タイプ | 説明 | 必須の引数 |
---|---|---|
コンソール | ロガーが閉じられたり、イベントの数が所定のレベルに達したりした場合は、出力がコンソールに書き込まれます。 | ログすべきナレッジセッション |
ファイル | 出力は XML でファイルに書き込まれます。 |
ログすべきナレッジセッション
作成するログファイル名
|
スレッドファイル | 指定の間隔があくと、出力がファイルに書きだされます。これは、デバッグ中にリアルタイムの進捗を可視確認する際に便利です。 |
ログすべきナレッジセッション
作成するログファイル名
イベントを保存する間隔 (ミリ秒)
|
KnowledgeRuntimeLoggerFactory
は、以下の例のようにロガーをセッションに追加できるようにします。アプリケーションの使用が終わるとロガーを常に終了するようにしてください。
例2.3 KnowledgeRuntimeLogger
KnowledgeRuntimeLogger logger = KnowledgeRuntimeLoggerFactory.newFileLogger( ksession, "test" ); // add invocations to the process engine here, // e.g. ksession.startProcess(processId); ... logger.close();

第3章 プロセスの概要
3.1. プロセスの概要

図3.1 ビジネスプロセス
- BPMN 2.0 仕様で定義されている XML スキーマに準拠する XML ファイル詳細は 「Business Process Model and Notation (BPMN) 2.0 仕様」 を参照してください。
- BRMS ユーザーインターフェースに含まれている Web ベースのグラフィカルデザイナー詳細は 「プロセスデザイナー」 を参照してください。
- JBoss Developer Studio プラグインでのグラフィカルプロセスエディター詳細は 「JBoss Developer Studio」 を参照してください。
3.2. プロセスノード
プロセスの最初と最後は両方、イベントの種類です。中間イベントは、プロセス実行中に発生する可能性のあるイベントを指します。
アクティビティは、プロセス実行中に行う必要のあるアクションのことです。
ゲートウェイは、プロセスを通る実行パスを定義する際に使用します。
3.3. プロセスプロパティ
- ID: プロセスの一意 ID
- 名前: プロセスの表示名
- バージョン: プロセスのバージョン番号
- パッケージ: プロセスが定義されているパッケージ (名前空間)
- 変数 (オプション): プロセス実行時にデータを格納する変数
- スイムレーン: ヒューマンタスクを割り当てるためのプロセスに使用するスイムレーン
3.4. イベント
表3.1 イベント
イベントタイプ | 追加のプロパティ | 使用法 |
---|---|---|
開始イベント
![]() | プロセスには開始ノード 1 つと外向きの接続が 1 つが含まれています。プロセスの実行は常に開始ノードから始まります。 | |
終了イベント
![]() |
|
プロセスには 1 つ以上の終了イベントが含まれます。各終了イベントには、内向き接続 1 つがあり、外向きの接続はありません。
プロセスが終了すると、(実行の並行パスにある) アクティブなノードはすべてキャンセルされます。終端処理のない終了イベントは、現在実行中のパスを終了しますが、他のパスが継続できるようにします。終端処理のある終了イベントは、イベントノードの中に完全な丸があり視覚的に区別できます。反対に終端処理のない終了イベントはイベントノードの中に何も入っていません。サブプロセス内で終端イベントノードを使用する場合、サブプロセスだけでなく最上位のプロセスインスタンスを終了する点に注意してください。
|
エラー送出イベント
![]() |
|
エラーイベントは、プロセス内の例外的な状態を通知するために使用します。このイベントには内向き接続が 1 つあり、外向き接続はありません。プロセス内でエラーイベントに到達すると、指定の名前を持ったエラーを送出します。プロセスでは、この種の問題を処理できる適切なエラーハンドラーを検索します。エラーハンドラーが見つからない場合は、プロセスインスタンスが中断されます。
エラーハンドラーは、XML で作業している場合、境界イベントを使用して指定することができます。
|
タイマーキャッチイベント
![]() |
|
タイマーキャッチイベントは、指定の時間が経過した後、1 回または複数回トリガー可能なタイマーを表します。タイマーイベントには、内向き接続が 1 つと外向き接続が 1 つあります。プロセス内でタイマーイベントに到達すると、関連付けられているタイマーが開始します。
式の構文や詳細については、「タイマー」 を参照してください。
|
シグナルキャッチイベント
![]() |
|
シグナルイベントは、プロセス実行時に内部または外部のイベントに対応するために使用することができます。シグナルイベントには、内向き接続なく、外向き接続 1 つ含まれています。このイベントは、予期されるイベントの種類を指定します。イベントの種類が検出されると、このイベントノードに接続されたノードがトリガーされます。
プロセスインスタンスは、以下を使用して、指定のイベントの発生についてシグナルを受けることができます。
ksession.signalEvent(eventType, data, processInstanceId)
これは、イベントの種類に関して待機中のプロセスインスタンスにある (アクティブな) シグナルイベントノードをすべてトリガーします。このイベントに関連するデータは、データパラメーターを使用して渡すことができます。イベントノードが変数名を指定している場合、イベント発生時にこのデータはその変数にコピーされます。
イベントはサブプロセス内で利用できますが、これらのイベントノードはサブプロセスがアクティブな場合のみアクティブになります。
シグナルは、スクリプトを用いてプロセスインスタンス内から生成できます。例えば、
kcontext.getKnowledgeRuntime().signalEvent(eventType, data, kcontext.getProcessInstance().getId()); |
- 内部イベント: プロセス内のアクション (例: アクションノードのアクション、または一部のノードの on-entry または on-exit アクション) は周りにあるプロセスインスタンスに対して、内部イベントの発生についてシグナルを送ることができます。内部イベントのサンプルコードは以下のとおりです。
kcontext.getProcessInstance().signalEvent(type, eventData);
- 外部イベント: プロセスインスタンスに対して、以下のようなコードを使うことで外部からイベントを通知できます。
processInstance.signalEvent(type, eventData);
- イベント相関を使った外部イベント: プロセスインスタンスを直接通知するのではなく、イベントタイプをベースとするイベント相関を使うことでイベントに関連しているプロセスインスタンスがどれであるか、自動的にエンジン側で判断できます。一部のタイプの外部イベントをリッスンするイベントノードを含むプロセスインスタンスは、イベントが発生するたびに通知されます。プロセスエンジンに対してこのようなイベントに関してシグナルを送るには、以下のコードを使います。
ksession.signalEvent(type, eventData);
3.5. アクティビティ
表3.2 アクティビティ
アクティビティの種類 | 追加のプロパティ | 使用法 |
---|---|---|
スクリプトのタスク
![]() |
| スクリプトタスクは、このプロセスで実行すべきスクリプトを指しています。関連のアクションは、実行スべきこと、アクションのコーディングに使用する方言 (Java または MVEL)、実際のアクションコードを指定します。このコードは、変数や Global 変数にアクセスできます。また、事前定義されている変数 'kcontext' もあり、これは 'ProcessContext' オブジェクトを参照します (このオブジェクトを使用して現在の ProcessInstance または NodeInstance にアクセスできます。また変数の取得と設定や以下を使って ksession へアクセスできるように、このオブジェクトを使用することができます)。
kcontext.getKnowledgeRuntime())プロセス内でスクリプトタスクに到達すると、アクションを実行して次のノードに進みます。 |
ユーザータスク
![]() |
|
プロセスは、ヒューマンアクターにより実行する必要のあるタスクが関連します。ユーザータスクは、ヒューマンアクターにより完了されるアトミックタスクを指します。ユーザータスクはスイムレーンとあわせて使用して、複数のヒューマンタスクを同様のアクターに割り当てることができます。スイムレーンとヒューマンタスクに関する詳細情報は、ヒューマンタスクの章を参照してください。
|
サービスタスク
![]() |
| サービスタスクは、このプロセスで実行すべき作業の抽象ユニットを指します。プロセスエンジンの外で実行される作業はすべて、サービスタスクを使用して (宣言的な方法で) 表現する必要があります。様々な種類のサービス (例:e-メールの送信、メッセージのロギングなど) が事前定義されていますが、各種ドメイン固有サービスまたは作業アイテムを定義できます。詳細は、ドメイン固有プロセスの章を参照してください。 |
ビジネスルールタスク
![]() |
|
ビジネスルールタスクは、評価する必要のあるルールセットのことです。ルールは、Drools ルール形式を使用して別ファイルで定義します。ルールは、ルールのヘッダーで ruleflow-group 属性を使用することで、指定のルールフローグループの一部となります。プロセスでルールタスクに到達すると、エンジンは該当の ruleflow-group の一部であるルールの実行を開始します (あれば)。このルールフローグループにアクティブなルールがなくなると、次のノードに自動的に進み実行されます。つまり、ルールフローグループの実行中は、現在アクティブなルールフローグループに所属する新規アクティベーションをアジェンダに追加することができます。これは、他のルールがファクトに変更を加えるため発生します。ルールフローがすでにアクティブな場合、ルールフローグループはアクティブな状態を保ち、ルールフローグループでアクティブなルールがすべて終わってから、実行は次に継続されます。
|
組み込みサブプロセス
![]() |
|
サブプロセスとは、ノードコンテナーの役割を果たせるように他のノードを含めることができるノードです。これは、このサブプロセスノードの中にプロセスの一部を埋め込むだけでなく、このコンテナー内にある全ノードにアクセス可能な追加変数も定義できます。サブプロセスは、開始イベント 1 つと、1 つ以上の終了イベントが必要です。
|
再利用可能なサブプロセス
![]() |
|
再利用可能なサブプロセスは、プロセス内から別のプロセスを呼び出すという部分を指します。再利用可能なサブプロセスノードにプロセス内で到達すると、エンジンは、指定の ID を持つプロセスを開始します。
|
マルチインスタンスのサブプロセス
![]() |
|
インスタンスが複数あるサブプロセスは特殊なサブプロセスで、プロセス内にあるセグメントを複数回実行できます (ただしコレクション内のの要素ごとに 1 回)。埋め込みプロセスのフラグメントは、指定のコレクション内の要素でそれぞれ終了するまで待機してから次に進みます。コレクションの式が Null または空のコレクションと評価した場合、複数インスタンスのサブプロセスは直後に完了して次の外向き接続に進みます。
|
- ビジネスユーザーが理解する必要のあるハイレベルのビジネスプロセスを定義する場合は、プロセス内にローレベルの実装詳細は含めないようにしてください。スクリプトタスクを使用して変数を操作することも可能ですが、サービスタスクのような他のコンセプトを使用してより高いレベルのより複雑な動作をモデリングすることもできます。
- スクリプトは、エンジンスレッドを使用してスクリプトを実行するため immediate でなければなりません。実行するまでに時間があくスクリプトは、非同期サービスタスクとしてモデリングする必要があります。
- スクリプトノード経由で外部のサービスに問い合わせしないようにしてください。代わりに、サービスタスクを使用して外部サービスとのモデル通信を使用してください。
- スクリプトは例外を送出しないようにしてください。ランタイムの例外はスクリプト内で検出して管理するか、プロセス内で処理できるようにシグナルかエラーに変換する必要があります。
この変数は org.drools.runtime.process.ProcessContext 型で、複数タスクに利用できます。
- 現在のノードインスタンス (該当する場合) を取得します。このノードインスタンスは、名前や型などのデータのクエリが可能です。現在のノードインスタンスの取り消しもできます。
NodeInstance node = kcontext.getNodeInstance(); String name = node.getNodeName();
- 現在のプロセスインスタンスを取得します。このプロセスインスタンスは、データ (名前、id、processid など) のクエリができ、内部イベントを中断またはシグナルを送ることが可能です。
ksession.signalEvent(eventType, data, processInstanceId)
- 変数の値の取得と設定
- ナレッジランタイムにアクセスすることで、プロセスの開始、(外部) イベントのシグナル、データの挿入などが可能になります。
Java および MVEL の両方を使用できます。Java アクションは、有効な Java コードでなければなりません。MVEL アクションはビジネススクリプト言語 MVEL を使用してアクションを表現できます。MVEL は有効な Java コードに対応していますが、パラメーターのネスト化アクセスにも追加対応しており (例:person.name instead of person.getName())、その他のスクリプト関連を強化しています。そのため、MVEL 式がビジネスユーザーにとってもより便利なものとなっています。例えば、プロセスの "requester" 変数で人の名前を出力するというアクションは、以下のようになります。
// Java dialect System.out.println( person.getName() ); // MVEL dialect System.out.println( person.name );
3.6. ゲートウェイ
- AND (Parallel)コントロールのフローは、外向き接続 (ブランチ) すべてでも同時に継続されます。
- XOR (Exclusive)コントロールのフローは、外向き接続の 1 つでのみ継続されます。優先順位が最も低く制約があり、True と評価される接続が選択されます。制約の定義に関する詳細は、「制約」 を参照してください。外向き接続の内、必ず 1 つはランタイム時に true と評価される必要があります。そうでないとランタイム時に例外が送出されます。

図3.2 Diverging Gateway
- ID: ノードの ID (1 つのノードコンテナー内で一意)
- Name: ノードの表示名
- Type: AND または XOR
- Constraints: 各外向き接続にリンクされている制約 (exclusive および inclusive gateways)

図3.3 Converging Gateway
- ID: ノードの ID (1 つのノードコンテナー内で一意)
- Name: ノードの表示名
- Type: AND または XOR
- 並行 (AND) 分岐が使用された場合、Converging Gateway はすべての内向きブランチが完了するまで待機してから次に進みます。
- 排他 (XOR) 分岐が使用された場合、Converging Gateway は 1 つの内向き接続が完了したらすぐ、次に進みます。
注記
3.7. データ
- プロセスレベルの変数は、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);.
3.8. 制約
- コード制約は、この制約に到達すると直接評価される Boolean 式です。コード制約は Java または MVEL のどちらかで記述します。Java および MVEL の両制約はプロセス内で定義されているグローバル変数と変数に直接アクセスできます。以下に有効な Java コードの制約に関する例を示しています。ここでは、person がプロセス内の変数となります。
return person.getAge() > 20;
以下に有効な MVEL コードの制約に関する例を示しています。ここでは、person がプロセス内の変数となります。return person.age > 20;
- ルール制約は通常の Drools ルール条件と同じです。Drools ルール言語の構文を使用して複雑な制約を表現します。これらのルールは、他のルールと同様、作業メモリ内のデータを参照することができます。また、グローバル変数へも直接参照可能です。以下に有効なルール制約の例を示しています。
Person( age > 20 )
これは、作業メモリで 21 歳以上の人がいるかテストします。
name
変数に格納されている値と同じ名前を持つ人を検索します。
processInstance : WorkflowProcessInstance() Person( name == ( processInstance.getVariable("name") ) ) # add more constraints here ...
3.9. タイマー
[#d][#h][#m][#s][#[ms]]
3.10. プロセスの更新
- Proceed: 実行中のプロセスインスタンスは通常どおり進み、プロセスインスタンスの開始時に定義したようにプロセス定義に従います。結果、すでに実行中のインスタンスは、プロセスが更新されていないかのように振る舞います。新規インスタンスは、更新プロセスを使用して開始することができます。
- Abort (および restart): すでに実行中のインスタンスは中断されます。必要であればプロセスインスタンスは新規プロセス定義を使用して再起動されます。
- Transfer: プロセスインスタンスは新規プロセス定義に移行されます。つまり正常に移行されると、更新されたプロセスロジックに従い実行が継続されます。詳細は 「プロセスインスタンスの移行」 を参照してください。
processInstance.getProcess().getVersion()
3.11. プロセスインスタンスの移行
// create the session and start the process "com.sample.process" KnowledgeBuilder kbuilder = ... StatefulKnowledgeSession ksession = ... ProcessInstance processInstance = ksession.startProcess("com.sample.process"); // add a new version of the process "com.sample.process2" kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder(); kbuilder.add(..., ResourceType.BPMN2); kbase.addKnowledgePackages(kbuilder.getKnowledgePackages()); // migrate process instance to new version Map<String, Long> mapping = new HashMap<String, Long>(); // top level node 2 is mapped to a new node with id 3 mapping.put("2", 3L); // node 2, which is part of composite node 5, is mapped to a new node with id 4 mapping.put("5.2", 4L); WorkflowProcessInstanceUpgrader.upgradeProcessInstance( ksession, processInstance.getId(), "com.sample.process2", mapping);
3.12. マルチスレッド
3.12.1. マルチスレッド
3.12.2. エンジン実行
Thread.sleep(...)
を実行しても、エンジンが別の場所で実行を継続することはなく、その期間中エンジンスレッドをブロックします。
completeWorkItem(...)
メソッドが返ってくるまで待機してから、実行を継続します。お使いのサービスハンドラーが即時実行を行わない場合、サービスハンドラーがサービスを非同期的に実行することが重要です。
3.13. 非同期ハンドラー
public class MyServiceTaskHandler implements WorkItemHandler { public void executeWorkItem(WorkItem workItem, WorkItemManager manager) { new Thread(new Runnable() { public void run() { // Do the heavy lifting here ... } }).start(); } public void abortWorkItem(WorkItem workItem, WorkItemManager manager) { } }
第4章 BPMN 2.0 Notation
4.1. Business Process Model and Notation (BPMN) 2.0 仕様
表4.1 BPMN 2.0 対応の要素と属性
要素 | 対応の属性 | 対応の要素 | 拡張属性 | 拡張要素 |
---|---|---|---|---|
定義 | rootElement BPMNDiagram | |||
process | processType isExecutable name id | property laneSet flowElement | packageName adHoc version | import global |
sequenceFlow | sourceRef targetRef isImmediate name id | conditionExpression | priority | |
interface | name id | operation | ||
operation | name id | inMessageRef | ||
laneSet | lane | |||
lane | name id | flowNodeRef | ||
import* | name | |||
global* | identifier type | |||
イベント | ||||
startEvent | name id | dataOutput dataOutputAssociation outputSet eventDefinition | x y width height | |
endEvent | name id | dataInput dataInputAssociation inputSet eventDefinition | x y width height | |
intermediateCatchEvent | name id | dataOutput dataOutputAssociation outputSet eventDefinition | x y width height | |
intermediateThrowEvent | name id | dataInput dataInputAssociation inputSet eventDefinition | x y width height | |
boundaryEvent | cancelActivity attachedToRef name id | eventDefinition | x y width height | |
terminateEventDefinition | ||||
compensateEventDefinition | activityRef | documentation extensionElements | ||
conditionalEventDefinition | condition | |||
errorEventDefinition | errorRef | |||
error | errorCode id | |||
escalationEventDefinition | escalationRef | |||
escalation | escalationCode id | |||
messageEventDefinition | messageRef | |||
message | itemRef id | |||
signalEventDefinition | signalRef | |||
timerEventDefinition | timeCycle timeDuration | |||
アクティビティ | ||||
task | name id | ioSpecification dataInputAssociation dataOutputAssociation | taskName x y width height | |
scriptTask | scriptFormat name id | script | x y width height | |
script | text[mixed content] | |||
userTask | name id | ioSpecification dataInputAssociation dataOutputAssociation resourceRole | x y width height | onEntry-script onExit-script |
potentialOwner | resourceAssignmentExpression | |||
resourceAssignmentExpression | expression | |||
businessRuleTask | name id | x y width height ruleFlowGroup | onEntry-script onExit-script | |
manualTask | name id | x y width height | onEntry-script onExit-script | |
sendTask | messageRef name id | ioSpecification dataInputAssociation | x y width height | onEntry-script onExit-script |
receiveTask | messageRef name id | ioSpecification dataOutputAssociation | x y width height | onEntry-script onExit-script |
serviceTask | operationRef name id | ioSpecification dataInputAssociation dataOutputAssociation | x y width height | onEntry-script onExit-script |
subProcess | name id | flowElement property loopCharacteristics | x y width height | |
adHocSubProcess | cancelRemainingInstances name id | completionCondition flowElement property | x y width height | |
callActivity | calledElement name id | ioSpecification dataInputAssociation dataOutputAssociation | x y width height waitForCompletion independent | onEntry-script onExit-script |
multiInstanceLoopCharacteristics | loopDataInputRef inputDataItem | |||
onEntry-script* | scriptFormat | script | ||
onExit-script* | scriptFormat | script | ||
ゲートウェイ | ||||
parallelGateway | gatewayDirection name id | x y width height | ||
eventBasedGateway | gatewayDirection name id | x y width height | ||
exclusiveGateway | default gatewayDirection name id | x y width height | ||
inclusiveGateway | default gatewayDirection name id | x y width height | ||
データ | ||||
property | itemSubjectRef id | |||
dataObject | itemSubjectRef id | |||
itemDefinition | structureRef id | |||
ioSpecification | dataInput dataOutput inputSet outputSet | |||
dataInput | name id | |||
dataInputAssociation | sourceRef targetRef assignment | |||
dataOutput | name id | |||
dataOutputAssociation | sourceRef targetRef assignment | |||
inputSet | dataInputRefs | |||
outputSet | dataOutputRefs | |||
assignment | from to | |||
formalExpression | language | text[mixed content] | ||
BPMNDI | ||||
BPMNDiagram | BPMNPlane | |||
BPMNPlane | bpmnElement | BPMNEdge BPMNShape | ||
BPMNShape | bpmnElement | Bounds | ||
BPMNEdge | bpmnElement | waypoint | ||
Bounds | x y width height | |||
waypoint | x y |
4.2. BPMN 2.0 プロセスの例

図4.1 グラフィカルな Hello World プロセス
例4.1 BPMN 2.0 XML Hello World プロセス
<?xml version="1.0" encoding="UTF-8"?><definitions id="Definition" targetNamespace="http://www.example.org/MinimalExample" typeLanguage="http://www.java.com/javaTypes" expressionLanguage="http://www.mvel.org/2.0" xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xs="http://www.w3.org/2001/XMLSchema-instance" xs:schemaLocation="http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" xmlns:tns="http://www.jboss.org/drools"><process processType="Private" isExecutable="true" id="com.sample.HelloWorld" name="Hello World" ><!-- nodes --><startEvent id="_1" name="StartProcess" /><scriptTask id="_2" name="Hello" ><script>System.out.println("Hello World");</script></scriptTask><endEvent id="_3" name="EndProcess" ><terminateEventDefinition/></endEvent><!-- connections --><sequenceFlow id="_1-_2" sourceRef="_1" targetRef="_2" /><sequenceFlow id="_2-_3" sourceRef="_2" targetRef="_3" /></process><bpmndi:BPMNDiagram><bpmndi:BPMNPlane bpmnElement="Minimal" ><bpmndi:BPMNShape bpmnElement="_1" ><dc:Bounds x="15" y="91" width="48" height="48" /></bpmndi:BPMNShape><bpmndi:BPMNShape bpmnElement="_2" ><dc:Bounds x="95" y="88" width="83" height="48" /></bpmndi:BPMNShape><bpmndi:BPMNShape bpmnElement="_3" ><dc:Bounds x="258" y="86" width="48" height="48" /></bpmndi:BPMNShape><bpmndi:BPMNEdge bpmnElement="_1-_2" ><di:waypoint x="39" y="115" /><di:waypoint x="75" y="46" /><di:waypoint x="136" y="112" /></bpmndi:BPMNEdge><bpmndi:BPMNEdge bpmnElement="_2-_3" ><di:waypoint x="136" y="112" /><di:waypoint x="240" y="240" /><di:waypoint x="282" y="110" /></bpmndi:BPMNEdge></bpmndi:BPMNPlane></bpmndi:BPMNDiagram></definitions>
第5章 プロセスデザイナー
5.1. プロセスデザイナー

5.2. プロセスデザイナーの設定
jboss-as/server/production/deploy/designer.war/profiles/
ディレクトリにある jbpm.xml
ファイルで設定しています。
- protocol: 使用するプロトコル (http/https)
- host: localhost:8080
- subdomain: jboss-brms/org.drools.guvnor.Guvnor/oryxeditor
- usr: admin (デフォルト。有効な JBoss BRMS ユーザーを使用すること)
- pwd: admin (デフォルト。有効な JBoss BRMS ユーザーのパスワードと一致すること)
注記
production/deploy/jboss-brms.war/WEB-INF/classes/preferences.properties
でも更新されます。
5.3. プロセスの作成と検証
手順5.1 プロセスの作成
- ナビゲーションパネルから、Knowledge Bases → Create New → New BPMN2 を選択します。
- Name: のダイアログボックスでプロセスの名前を入力します。
- ドロップダウンメニューからプロセス作成に使用するパッケージを選択して、説明を入力します。
注記
Red Hat は、プロセス属性のすべてが他のパッケージに正常にインポートされるとは限らないため、この段階ではグローバルエリアでプロセスを作成しないように推奨しています。 - プロセスは、画面の左側にある Shape レポジトリパネルから画面の中央にあるキャンバスにプロセス要素をドラッグアンドドロップして作成します。Shape レポジトリパネルからプロセスを開始するノードを選択して、キャンバスにドラッグします。プロセスデザイナーの右側にある properties パネルの Name の横にある値のカラムをクリックしてノードに名前をつけます。
- プロセスで次に来るノードを追加するには、Shape レポジトリパネルから必要なノード型を選択してキャンバスにドラッグします。Properties パネルでノードのプロパティを編集します。
- 次にノードの接続ですが、最初のノードをクリックして、矢印アイコンを選択してホールドした状態で、2 番目のノードにドラッグします。
- プロセスが完了するまでノードと接続の追加を繰り返します。
新規プロセスの作成時には、プロセス名やプロセス ID にユニコード文字を含めないようにしてください。現在、この機能はサポートされておらず、プロセスアセットの保存やリトリーブの際にプロセスデザイナーが予期せぬ動作をする可能性があります。
プロセスデザイナーは、プロセスが完了していることを確認するために利用することができます。バリデーションエラーが発生した場合、エラーメッセージが表示されますが、バリデーションエラーを使用してプロセスが全体的に正しいかどうかの確認はしないようにしてください。
5.4. 既存プロセスのインポート
5.4.1. 既存の BPMN2 プロセスのインポート
- Upload an existing file from the local filesystem (ローカルのファイルシステムから既存のファイルをアップロード)
- Copy and paste the BPMN2 XML directly into the import dialogue box (インポートのダイアログボックスに BMPN2 XML をコピー、貼り付け)
5.4.2. jPDL 3.2 から BPMN2 への移行
重要
手順5.2 jPDL 3.2 移行ツールの有効化
- サーバーを停止します。
server/profile/deploy/designer.war/profiles/
ディレクトリから jbpm.xml を探します。- JPDL 移行プラグインツールのエントリから以下のコメントタグを削除します。
<!-- plugin name="ORYX.Plugins.JPDLMigration"/ -->
- コメントタグを削除した状態で、このファイルを保存します。
<plugin name="ORYX.Plugins.JPDLMigration"/>
- サーバーを再起動します。
- JBoss BRMS ユーザーインターフェースにログインして、プロセスデザイナーに移動します。jPDL 移行ツールボタンがプロセスデザイナーのユーザーインターフェースに追加されています。
図5.1 jPDL 移行ツール
5.5. プロセスの表示と共有
- ERDF
- JSON
- PDF
- PNG
- BPMN2
- SVG
注記
- プロセスの画像
- プロセスの PDF
- 埋め込みプロセス
5.6. ドメイン固有サービスノードの定義
手順5.3 サービスノードの定義
- ナビゲーションパネルから、Knowledge Bases → Create New → New Work Item Definition を選択します。
- Name: のダイアログボックスで定義の名前を入力します。サービスノードを割り当てるパッケージを選択するか、Create in Global Area を選択して、説明を追加し OK をクリックします。
- 必要であればサービスノードを設定します。例えば、e-メールサービスノードは
Email
に、パラメーターはTo
、From
、Subject
、Body
に、型はすべて文字列に指定することができます。既存のパラメーターを編集して Parameter ボタンを使って新しいパラメーターを追加します。作業タスクの必須名を表示するには、表示名を編集します。File → Save Changes 選択します。 - サービスノードのアイコンをアップロードします。Create New → Create a file を選択します。Name のダイアログボックスに名前を入力します。ファイルの拡張子の種類を入力します。ファイルを作成すべきパッケージを選択して、OK をクリックします。
- Choose File をクリックしてローカルファイルシステムから画像を選択して、Upload をクリックします。
- アイコンをサービスノードに追加します。ナビゲーションパネルからパッケージ名をクリックします。次に WorkItemDefinition タブを展開してワークを選択して、対象のサービスノードの open をクリックします。アイコンについては、PNG と GIF の形式に対応しています。このアイコンは、Select Icon to add のドロップダウンメニューから選択できるようになっています。使用するアイコンを選択します。
- File → Save Changes をクリックします。
- 新しいノードをプロセスに追加するには、プロセスを開きます。
- ナビゲーションパネルから Knowledge Bases → Packages を選択して、対象のパッケージを選びます。
- assets タブのプロセスエリアを展開して、必要とするプロセスの open をクリックします。
- 必要であれば、Shape Repository から Service Tasks タブを展開してプロセス上の新しいサービスノードをドラッグします。
5.7. サービスレポジトリへの接続
手順5.4 サービスレポジトリへの接続
- JBoss BRMS ユーザーインターフェースにログインします。
- 編集する既存プロセスを選択するか、新しいプロセスを作成して、プロセスデザイナーにアクセスします。
- サービスレポジトリのアイコンを選択して、サービスレポジトリ URL に移動します。
図5.2 サービスレポジトリ接続
- サービスレポジトリの URL を入力して、Connect をクリックします。
- 対象のサービスをダブルクリックしてパッケージに追加して、プロセスデザイナーの Shape Repository で利用できるようにします。
5.8. プロセスとタスクフォームの生成



第6章 JBoss Developer Studio
6.1. JBoss Developer Studio
注記
6.2. プロジェクトの作成
手順6.1 新規プロジェクトの作成
- File → New → Project を選択します。
- jBPM → jBPM project を選択します。
- プロジェクト名を Project name: テキストボックスに入力して、Next をクリックしてください。
注記
JBDS では、サンプルの HelloWorld プロセスをプロジェクトに追加するオプションがあります。このデフォルト設定を確定して、次のステップでサンプルプロジェクトのテストを行います。 - プロジェクトをテストするには、主なメソッドを含む Java ファイルを右クリックして、Run → run as → Java Application を選択してください。Console タブに出力が表示されます。
6.3. プロセスの作成
手順6.2 新規プロセスの作成
- 新しいプロセスを作成するには、File → New → Other を選んでから、jBPM → BPMN2 Process を選択します。
- プロセスの親フォルダーを選択します。
- File name: ダイアログボックスに名前を入力して、Finish をクリックしてください。
- プロセスの .bpmn ファイルを右クリックしてグラフィカルエディターを開き、Open With を選んで BPMN2 Process Editor の横にあるラジオボタンをクリックします。
- プロセスにノードを追加するには、パレット内の対象のノードをクリックして、ノードを設置すべきキャンバスをクリックします。
- シーケンスフローでノードを接続します。パレットから Sequence Flow を選択して、接続する各ノードをクリックします。
- ノードのプロパティを編集するには、ノードをクリックして JBDS ワークスペースの一番下のパネルにある properties タブを開き、編集する値をクリックします。properties タブが開いていない場合、パッケージパネルの bpmn ファイルを右クリックして Show in → Properties を選択します。
- 保存アイコンをクリックしてプロセスを保存します。
6.4. バリデーションとデバッグ
プロセスのバリデーションを実施するには、.bpmn ファイルを右クリックして Validate を選択します。
プロセスをデバッグするには、.bpmn ファイルを右クリックして Debug As → Debug Configurations を選択します。テスト設定に必要な変更を加えて Debug をクリックします。
第7章 永続性
7.1. 永続性
- ランタイム
- プロセス定義
- 履歴情報 (ログ)
7.2. ランタイムのステータス
7.2.1. ランタイムのステータス
ksession.getProcessInstance(id)
7.2.2. セーフポイント
7.2.3. バイナリの永続性
- プロセスインスタンスの情報がバイナリデータに変換されます。パフォーマンスの理由から、通常の Java の直列化ではなくカスタムの直列化メカニズムが使用されています。
- バイナリデータはプロセスインスタンスに関する他のメタデータと併せて保存されます。このメタデータには、プロセスインスタンス ID、プロセス ID、プロセスの開始日が含まれています。
ksession.getId()
を使用してリトリーブ可能です。

図7.1 データモデル
sessioninfo
エンティティには、プロセスインスタンスが実行中の (ナレッジ) セッションのステータスが含まれています。
表7.1 SessionInfo
フィールド | 説明 | Null 許容型 |
---|---|---|
id | プライマリキー | Null 不可 |
lastmodificationdate | エンティティがデータベースに最後に保存された時間 | |
rulesbytearray | セッションのステータスが含まれているバイナリデータセット | Null 不可 |
startdate | セッションの開始時間 | |
optlock | 楽観ロックの値としての機能を果たすバージョンフィールド |
processinstanceinfo
エンティティには、プロセスインスタンスのステータスが含まれています。
表7.2 ProcessInstanceInfo
フィールド | 説明 | Null 許容型 |
---|---|---|
instanceid | プライマリキー | Null 不可 |
lastmodificationdate | エンティティがデータベースに最後に保存された時間 | |
lastreaddate | エンティティがデータベースから最後にリトリーブされた時間 | |
processid | プロセスの名前 (ID) | |
processinstancebytearray | プロセスインスタンスのステータスが含まれているバイナリデータセット | Null 不可 |
startdate | プロセスの開始時間 | |
state | プロセスインスタンスのステータスを示す整数 | Null 不可 |
optlock | 楽観ロックの値としての機能を果たすバージョンフィールド |
eventtypes
エンティティには、プロセスインスタンスで発生した/実行するイベントに関する情報が含まれています。
表7.3 EventTypes
フィールド | 説明 | Null 許容型 |
---|---|---|
instanceid | processinstanceinfo プライマリキーを参照しており、このカラムにはかい部キーの制約があります。 | Null 不可 |
element | プロセスで行ったイベントに関連する文字フィールド |
workiteminfo
エンティティには、作業アイテムのステータスが含まれています。
表7.4 WorkItemInfo
フィールド | 説明 | Null 許容型 |
---|---|---|
workitemid | プライマリキー | Null 不可 |
name | 作業アイテムの名前 | |
processinstanceid | プロセスの (プライマリキー) ID。このフィールドには外部キーの制約はありません。 | Null 不可 |
state | 作業アイテムのステータスを表す整数 | Null 不可 |
optlock | 楽観ロックの値としての機能を果たすバージョンフィールド | |
workitembytearay | 作業アイテムのステータスを含むバイナリデータセット | Null 不可 |
7.3. 永続性の設定
7.3.1. 永続性の設定
7.3.2. 依存関係の追加
- JBoss BRMS 5.3 デプロイ可能パッケージ
- データベースベンダーの JDBC ドライバー
- トランザクションマネージャー
注記
- jbpm-test
- jbpm-persistence-jpa
- drools-persistence-jpa
- persistence-api
- hibernate-entitymanager
- hibernate-annotations
- hibernate-commons-annotations
- hibernate-core
- commons-collections
- dom4j
- jta
- btm
- javassist
- slf4j-api
- slf4j-jdk14
- h2
7.3.3. 永続性を使用するためのエンジン設定
jbpm-test
モジュールの JBPMHelper
クラスには、セッションを作成するメソッドがあり、設定ファイルを使用してこのセッションを設定します。以下の情報は、永続性が有効になっている H2 in-memory データゲースを使用する jBPM.properties ファイルの例を紹介しています。
例7.1 jBPM.properties ファイルの例
# for creating a datasource persistence.datasource.name=jdbc/jbpm-ds persistence.datasource.user=sa persistence.datasource.password= persistence.datasource.url=jdbc:h2:tcp://localhost/~/jbpm-db persistence.datasource.driverClassName=org.h2.Driver # for configuring persistence of the session persistence.enabled=true persistence.persistenceunit.name=org.jbpm.persistence.jpa persistence.persistenceunit.dialect=org.hibernate.dialect.H2Dialect # for configuring the human task service taskservice.enabled=true taskservice.datasource.name=org.jbpm.task taskservice.transport=mina taskservice.usergroupcallback=org.jbpm.task.service.DefaultUserGroupCallbackImpl
JBPMHelper
クラスを使用してデータソースを登録することができます。
JBPMHelper.setupDataSource();
JBPMHelper
クラスは、セッションの作成にも使用可能です (ナレッジベースが作成された後)。
StatefulKnowledgeSession ksession = JBPMHelper.newStatefulKnowledgeSession(kbase);
startProcess
) で呼び出すことが可能となり、エンジンは作成したデータソースですべてのランタイムのステータスを永続化します。
JBPMHelper
クラスは、セッション ID を渡すことでデータベースからセッションのステータスをリストアしてセッションを再作成する際に使用できます。セッション ID は ksession.getId()
を使用してリトリーブします。
StatefulKnowledgeSession ksession = JBPMHelper.loadStatefulKnowledgeSession(kbase, sessionId);
7.3.4. セッション ID
7.3.4.1. セッション ID
jbpmSessionId.ser
ファイルに格納されます。jbpmSessionId.ser
ファイルが存在しない場合は、作成されセッション ID が保存されます。ファイルが存在する場合はセッション ID がこのファイルから読み込まれ、セッションがデータベースからロードされるので、サーバーを再起動した後もセッションを再度ロードすることができます。
jbpmSessionId.ser
ファイルは jboss-as/server/profile/tmp/
ディレクトリにありますが、jboss-as/server/profile/deploy/business-central-server.war/WEB-INF/classes/
ディレクトリにある jbpm.console.properties
の jbpm.console.tmp.dir
プロパティを修正することで変更できます。
7.3.5. トランザクション
// create the entity manager factory and register it in the environment EntityManagerFactory emf = Persistence.createEntityManagerFactory( "org.jbpm.persistence.jpa" ); Environment env = KnowledgeBaseFactory.newEnvironment(); env.set( EnvironmentName.ENTITY_MANAGER_FACTORY, emf ); env.set( EnvironmentName.TRANSACTION_MANAGER, TransactionManagerServices.getTransactionManager() ); // create a new knowledge session that uses JPA to store the runtime state StatefulKnowledgeSession ksession = JPAKnowledgeService.newStatefulKnowledgeSession( kbase, null, env ); // start the transaction UserTransaction ut = (UserTransaction) new InitialContext().lookup( "java:comp/UserTransaction" ); ut.begin(); // perform multiple commands inside one transaction ksession.insert( new Person( "John Doe" ) ); ksession.startProcess( "MyProcess" ); // commit the transaction ut.commit();
7.4. 履歴ログ
7.4.1. 履歴ログ
7.4.2. ビジネスアクティビティ監視のデータモデル

図7.2 ビジネスアクティビティ監視のデータモデル
ProcessInstanceLog
の表には、プロセスインスタンスに関する基本的なログ情報が含まれます。
表7.5 ProcessInstanceLog
フィールド | 説明 | Null 許容型 |
---|---|---|
id | ログエンティティのプライマリキーおよび ID | Null 不可 |
end_date | プロセスインスタンスの終了日 (あれば) | |
processid | プロセスの名前 (ID) | |
processinstanceid | プロセスインスタンス ID | Null 不可 |
start_date | プロセスインスタンスの開始日 |
NodeInstanceLog
の表には、各プロセスインスタンス内で実行されたノードの情報が含まれます。ノードインスタンスが内向き接続の 1 つから入ってくるか、外向き接続の 1 つから出てくる度に、ノードの情報がこの表に格納されます。
表7.6 NodeInstanceLog
フィールド | 説明 | Null 許容型 |
---|---|---|
id | ログエンティティのプライマリキーおよび ID | Null 不可 |
log_date | イベントの日付 | |
nodeid | プロセス定義内の対象ノードのノード ID | |
nodeinstanceid | ノードインスタンス ID | |
nodename | ノード名 | |
processid | プロセスインスタンスが実行するプロセス ID | |
processinstanceid | プロセスインスタンス ID | Null 不可 |
type | イベントのタイプ (0 = enter, 1 = exit) | Null 不可 |
VariableInstanceLog
の表には、変数インスタンスの変更に関する情報が含まれています。デフォルトは、変数が変更された後にだけログのエントリを生成するようになっていますが、変数の値が変更する前でもエントリをログ記録することができます。
表7.7 VariableInstanceLog
フィールド | 説明 | Null 許容型 |
---|---|---|
id | ログエンティティのプライマリキーおよび ID | Null 不可 |
log_date | イベントの日付 | |
processid | プロセスインスタンスが実行するプロセス ID | |
processinstanceid | プロセスインスタンス ID | Null 不可 |
value | ログが作成された時点の変数の値 | |
variableid | プロセス定義の変数 ID | |
variableinstanceid | 変数インスタンス ID |
7.4.3. データベースへのプロセスイベントの格納
StatefulKnowledgeSession ksession = ...; JPAWorkingMemoryDbLogger logger = new JPAWorkingMemoryDbLogger(ksession); // invoke methods one your session here logger.dispose();
addFilter
メソッドを呼び出すことで 1 つ以上のフィルターを追加して、該当する情報のみがデータベースに格納されるようにします。
business-central-server.war/WEB-INF/classes/META-INF/
ディレクトリにある persistence.xml
ファイルで設定します。
<?xml version="1.0" encoding="UTF-8" standalone="yes"?><persistence version="1.0" xsi:schemaLocation= "http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd http://java.sun.com/xml/ns/persistence/orm http://java.sun.com/xml/ns/persistence/orm_1_0.xsd" xmlns:orm="http://java.sun.com/xml/ns/persistence/orm" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/persistence"><!--persistence-unit name="ProcessService"><jta-data-source>java:/DefaultDS</jta-data-source><properties><property name="hibernate.hbm2ddl.auto" value="create-drop"/></properties></persistence-unit--><persistence-unit name="org.jbpm.persistence.jpa" transaction-type="JTA"><provider>org.hibernate.ejb.HibernatePersistence</provider><jta-data-source>java:/DefaultDS</jta-data-source><mapping-file>META-INF/JBPMorm.xml</mapping-file><class>org.jbpm.persistence.processinstance.ProcessInstanceInfo</class><class>org.drools.persistence.info.SessionInfo</class><class>org.drools.persistence.info.WorkItemInfo</class><class>org.jbpm.process.audit.ProcessInstanceLog</class><class>org.jbpm.process.audit.NodeInstanceLog</class><class>org.jbpm.process.audit.VariableInstanceLog</class><properties><property name="hibernate.dialect" value="org.hibernate.dialect.HSQLDialect"/><property name="hibernate.max_fetch_depth" value="3"/><property name="hibernate.hbm2ddl.auto" value="update" /><property name="hibernate.show_sql" value="false" /><property name="hibernate.transaction.manager_lookup_class" value="org.hibernate.transaction.JBossTransactionManagerLookup" /></properties></persistence-unit></persistence>
第8章 Business Central コンソール
8.1. Business Central コンソール
8.2. Business Central コンソールと BRMS 統合
8.2.1. Business Central コンソールと BRMS 統合
8.2.2. Business Central コンソールの設定
jboss-as/server/profile/deploy/business-central-server.war/WEB-INF/classes/
ディレクトリの jbpm.console.properties
ファイルで設定されています。このファイルでは以下のプロパティが設定されています。
注記
jbpm.console.properties
ファイルにデフォルトで含まれているわけではありません。
- jbpm.console.server.host (デフォルト localhost)
- jbpm.console.server.port (デフォルト 8080)
- jbpm.console.task.service.host (デフォルト localhost)。タスクサーバーがデプロイされるホストは全トランスポートに適用されます。
- jbpm.console.tmp.dir: 直近に使用した永続セッションのセッション ID を格納する
jbpmSessionId.ser
ファイルの場所を設定する際に使用する任意のプロパティ - jbpm.console.task.service.port: タスクサーバーがデプロイされるポート (HornetQ を使用している場合は 5446)
- jbpm.console.task.service.strategy (デフォルト HornetQ)
- JMSTaskClient.connectionFactory (デフォルトなし): JMS のみを対象とする接続ファクトリの JNDI 名
- JMSTaskClient.acknowledgeMode (デフォルトなし): JMS のみを対象とする応答確認 (AM) モード
- JMSTaskClient.transactedQueue (デフォルトなし): JMS のみを対象とするトランザクションキューの名前
- JMSTaskClient.queueName (デフォルトなし): JMS のみを対象とするキューの名前
- JMSTaskClient.responseQueueName (デフォルトなし): JMS のみを対象とする応答キューの名前
- guvnor.protocol (デフォルト http)
- guvnor.host (デフォルト localhost:8080)
- guvnor.subdomain (デフォルト drools-guvnor)
- guvnor.usr (デフォルト admin)
- guvnor.pwd (デフォルト admin)
- guvnor.packages (Guvnor からロードするパッケージをコンマで区切った一覧。パッケージが指定されていない場合は、全パッケージが表示されます。表示対象のパッケージが指定されている場合は、指定のパッケージのみが表示されることを忘れないでください)。
- guvnor.connect.timeout (デフォルト 10000)
- guvnor.read.timeout (デフォルト 10000)
- guvnor.snapshot.name (デフォルト LATEST): 使用するスナップショットを指定する任意のプロパティです。
注記
jboss-as/server/production/deploy/jboss-brms.war/WEB-INF/components.xml
の認証情報と一致する必要があります。認証情報がどちらか一方で変更された場合、どちらの場所にある情報も変更する必要があります。
8.2.3. ユーザーとグループの管理
server/profile/conf/props/
ディレクトリの brms-roles.properties
ファイルで指定します。
8.3. Business Central コンソールへのログイン
8.4. プロセスインスタンスの管理
プロセスインスタンスの管理
- プロセスインスタンスの管理
- Processes メニューの配下にあるプロセスインスタンスの表には特定のプロセス定義に対して実行中のインスタンスがすべて表示されます。この特定のプロセスインスタンスについての詳細を表示するには、プロセスインスタンスを 1 つ選択してください。
- 新規プロセスインスタンスの開始
- 新しいプロセスインスタンスは、プロセス定義一覧からプロセス定義を選択して Start を押して開始します。フォームがプロセスと関連付けられている場合 (プロセス開始前に追加情報を要求)、フォームが表示されます。フォームへの入力を終えると、提供した情報を使用してプロセスが開始されます。
- プロセスインスタンスのステータスの確認
- 特定のプロセスインスタンスのステータスを確認するには、Diagram ボタンをクリックします。すると、現在アクティブなノードに赤い三角の印がついた状態でプロセスフロー図が表示されます。
- プロセスインスタンスの変数の確認
- トップレベルのプロセスインスタンス変数は、Instance Data ボタンをクリックすることで確認できます。
- プロセスインスタンスの終了
- プロセスインスタンスを終了するには、Terminate ボタンをクリックします。
- プロセスインスタンスの削除
- プロセスインスタンスを削除するには、Delete ボタンをクリックします。
- プロセスのシグナル送信
- 中間シグナルイベントを検出するように定義されたプロセスにシグナルを送信するには、signal ボタンをクリックします。
8.5. ヒューマンタスクのリスト
8.6. サービスハンドラーの登録
drools.session.conf
ファイル内で指定します。
drools.workItemHandlers = CustomerWorkItemHandlers.conf
[ "log" : new org.jbpm.process.instance.impl.demo.SystemOutWorkItemHandler(), ]
8.7. 新規プロセスとタスクフォームの追加
<html><body><h2>Start Performance Evaluation</h2><hr><form action="complete" method="POST" enctype="multipart/form-data"> Please fill in your username: <input type="text" name="employee" /></BR><input type="submit" value="Complete"></form></body></html>
<html><body><h2>Employee evaluation</h2><hr> ${task.descriptions[0].text}<br/><br/> Please fill in the following evaluation form: <form action="complete" method="POST" enctype="multipart/form-data"> Rate the overall performance: <select name="performance"><option value="outstanding">Outstanding</option><option value="exceeding">Exceeding expectations</option><option value="acceptable">Acceptable</option><option value="below">Below average</option></select><br/><br/> Check any that apply:<br/><input type="checkbox" name="initiative" value="initiative">Displaying initiative<br/><input type="checkbox" name="change" value="change">Thriving on change<br/><input type="checkbox" name="communication" value="communication">Good communication skills<br/><br/><input type="submit" value="Complete"></form></body></html>
<html><body><h2>Request Review</h2><hr> UserId: ${userId} <br/> Description: ${description} <br/> Date: ${date?date} ${date?time} <form action="complete" method="POST" enctype="multipart/form-data"> Comment:<BR/><textarea cols="50" rows="5" name="comment"></textarea></BR><input type="submit" name="outcome" value="Accept"><input type="submit" name="outcome" value="Reject"></form></body></html>
jbossas/server/profile/lib
ディレクトリの jar の中にあるか、jbpm コンソールサーバー war の jbpm-gwt-form.jar のサンプルフォームのセットに追加されている) クラスパスにあるか、JBoss BRMS プロセスレポジトリに格納することができます。
8.8. REST インターフェース
/business-central-server/rs/task/{taskId}/close
/business-central-server/rs/process/definition/{id}/new_instance
第9章 ドメイン固有プロセス
9.1. ドメイン固有サービスノード
- 宣言型 (how ではなく what を記述)
- ハイレベル (コードなし)
- コンテキストに適合可能
例9.1 看護師の依頼タスク

9.2. 作業アイテムの定義
Name: "Notification" Parameters From [String] To [String] Message [String] Priority [String]
META-INF
ディレクトリのプロジェクトパスにある 1 つまたは複数の設定ファイル (.wid ファイル拡張) で指定します。プロパティは、名前と値のペアで指定します。パラメーターと結果はマッピングされ、各パラメーター名は結果として期待されるデータ型にマッピングされます。設定ファイルには、その作業アイテムの表示名やアイコンも含まれています。
例9.2 MVEL を使用した「通知」作業アイテムの例
import org.drools.process.core.datatype.impl.type.StringDataType; [ // the Notification work item [ "name" : "Notification", "parameters" : [ "Message" : new StringDataType(), "From" : new StringDataType(), "To" : new StringDataType(), "Priority" : new StringDataType(), ], "displayName" : "Notification", "icon" : "icons/notification.gif" ] ]
resources
ディレクトリに保存するものとします。
project/src/main/resources/icons/notification.gif
- Parameter Mapping:プロセス内の変数の値を作業アイテムのパラメーターにマッピングします。作業アイテムは、実際のプロセスインスタンスの現在のステータスにしたがいカスタマイズすることが可能です (例えば、通知の優先順位はプロセス固有の情報に左右されるなど)。
- Result Mapping:結果をプロセス変数にマッピングします。これは作業アイテムが実行された後に返される値で、この変数を残りのプロセスで利用できるようにします。
- Wait for completion:デフォルトでは、依頼された作業アイテムが完了するまで待機してから、プロセスを継続します。また、Wait for completion を False に設定することで、(結果を待たずに) 作業アイテムの依頼直後にプロセスを継続させることも可能です。
例9.3
import org.drools.process.core.datatype.impl.type.StringDataType; [ // the Java Node work item located in: // project/src/main/resources/META-INF/JavaNodeDefinition.conf [ "name" : "JavaNode", "parameters" : [ "class" : new StringDataType(), "method" : new StringDataType(), ], "displayName" : "Java Node", "icon" : "icons/java.gif" ] ]
9.3. 作業定義の登録
drools.workDefinitions = MyWorkDefinitions.wid
drools.workDefinitions = MyWorkDefinitions.conf WorkDefinitions.conf
注記
.wid
拡張を使用するように推奨しています。
9.4. サービスノードの実行
package com.sample; import org.drools.runtime.process.WorkItem; import org.drools.runtime.process.WorkItemHandler; import org.drools.runtime.process.WorkItemManager; public class NotificationWorkItemHandler implements WorkItemHandler { public void executeWorkItem(WorkItem workItem, WorkItemManager manager) { // extract parameters String from = (String) workItem.getParameter("From"); String to = (String) workItem.getParameter("To"); String message = (String) workItem.getParameter("Message"); String priority = (String) workItem.getParameter("Priority"); // send email EmailService service = ServiceRegistry.getInstance().getEmailService(); service.sendEmail(from, to, "Notification", message); // notify manager that work item has been completed manager.completeWorkItem(workItem.getId(), null); } public void abortWorkItem(WorkItem workItem, WorkItemManager manager) { // Do nothing, notifications cannot be aborted } }
ksession.getWorkItemManager().registerWorkItemHandler( "Notification", new NotificationWorkItemHandler());
- プロセスがより宣言形式になり、方法でななく何を実行するのかを指定します。
- 環境の変更は、作業アイテムハンドラーを変更することで実装することができます。プロセス自体は変更しないようにしてください。
- 作業アイテムハンドラーが対象のサービスとの統合を行なっている場合、別の環境でも同じプロセスを利用することができます。
- 作業アイテムハンドラーは、プロセスやプロジェクトの境界を超えて、簡単に共有できます (プロセス自体にコードが埋め込まれている場合はより困難になります)。
- コンテキストにあわせて、様々な作業アイテムハンドラーを使用することができます。例えば、テストやシミュレーションには、作業アイテムを実行する必要がない場合もあります。このような場合、テスト時にはダミーの特別作業アイテムハンドラーを使用します。
9.5. サービスレポジトリ
例9.4 サービスレポジトリの設定ファイル
import org.drools.process.core.datatype.impl.type.StringDataType; [ [ "name" : "Twitter", "description" : "Send a twitter message", "parameters" : [ "Message" : new StringDataType() ], "displayName" : "Twitter", "eclipse:customEditor" : "org.drools.eclipse.flow.common.editor.editpart.work.SampleCustomEditor", "icon" : "twitter.gif", "category" : "Communication", "defaultHandler" : "org.jbpm.process.workitem.twitter.TwitterHandler", "documentation" : "index.html", "dependencies" : [ "file:./lib/jbpm-twitter.jar", "file:./lib/twitter4j-core-2.2.2.jar" ] ] ]
- icon プロパティは、拡張設定ファイルと同じフォルダーにある (指定のファイル名の) ファイルを参照するようにしてください (これにより、インポートウィザードからのダウンロードやプロセス図での使用が可能になります)。アイコンは、16x16 GIF ファイルでなければなりません。
- category プロパティは、レポジトリをブラウズする際に利用する、このサービスのカテゴリを定義します。
- defaultHandler プロパティは、デフォルトのハンドラー実装を定義します (
WorkItemHandler
インターフェースを実装する java クラスで、サービスの実行に使用可能)。これにより、レポジトリからサービスをインポートする際に、このサービスのハンドラーとして自動的に登録されます。 - documentation プロパティは、サービスが何をしてどのように機能するのかを説明している文書ファイルを定義します。このプロパティは、拡張設定ファイルと同じフォルダーにある (指定のファイル名の) HTML ファイルを参照するようにしてください (これにより、インポートウィザードからのダウンロードやプロセス図での使用が可能になります)。
- dependencies プロパティは、このサービスを実行するために必要となる追加の依存関係を定義します。通常このプロパティにはハンドラー実装 jar が含まれていますが、追加で外部の依存関係が含まれる場合もあります。サービスのインポート時にインポートウィザードからダウンロードができるように、これらの依存関係も指定の場所 (拡張設定ファイルの場所と相対的なフォルダー) にあるレポジトリーに設置する必要があります。
index.conf
ファイルが配備されている必要があります。これらのフォルダーには、それぞれ以下を含めるものとします。
- フォルダーと同じ名前の拡張設定ファイル (例: サービスタスクを定義する
Twitter.conf
) - 設定ファイル内で参照するアイコン
- 設定ファイル内で参照する文書
- 設定ファイル内で参照する依存関係 (例: lib フォルダー内)
index.conf
を追加します。インポートウィザードを使用してレポジトリをブラウズしてもレポジトリの階層構造は表示されない点に留意してください。代わりに設定ファイルの category プロパティを使用します。
手順9.1 サービスレポジトリからのリソースのインポート手順
- プロジェクトを右クリックして Import... を選択します。
- インポートするリソースのソースを選択します。Guvnor → Resources from Guvnor を選び、Next をクリックします。
- リソースに移動します。Guvnor 内のリソースのあるパッケージを選択して、そのリソースをハイライトします。Menu をクリックします。
- リソースのインポート先を選択して、Finish をクリックします。
第10章 ヒューマンタスク
10.1. ヒューマンタスク
- ヒューマンタスクノードは、プロセスモデル内に含める必要があります。
- タスク管理コンポーネントは、BRMS BPM (BRMS 5.3 スタンドアローンには WS-Human Task が同梱されている) と統合する必要があります。
- エンドユーザーは、タスクを依頼、請求、完了するためにヒューマンタスククライアントと対話する必要があります。
10.2. ヒューマンタスクのプロセスへの追加
10.2.1. ユーザータスクノード

注記
- ID: ノードの ID (1 つのノードコンテナー内で一意)
- Name: ノードの表示名
- TaskName: ヒューマンタスクの名前
- Priority: ヒューマンタスクの優先順位を指定する整数
- Comment: ヒューマンタスクに関連するコメント
- ActorId: ヒューマンタスクの実行を担当するアクター ID。アクター ID の一覧を指定するには、区切り文字としてコンマ (',') を使用してください。
- GroupId: ヒューマンタスクの実行を担当するグループ ID。グループ ID の一覧を指定するには、区切り文字としてコンマ (',') を使用してください。
- Skippable: ヒューマンタスクが任意かどうかを指定します。アクターがタスクの実行をしないと決定することができるかどうか。
- Content: このタスクに関連付けられたデータ
- Swimlane: このヒューマンタスクノードの一部となるスイムレーン。スイムレーンは、同じアクターに複数のヒューマンタスクを簡単に割り当てることができます。
- On entry and on exit actions: このノードが出入の際に実行されるアクションスクリプト
- Parameter mapping: プロセス変数の値をヒューマンタスクのパラメーターにコピーできるようにします。ヒューマンタスクを作成すると、値がコピーされます。
- Result mapping: ヒューマンタスクの結果パラメーターの値をプロセス変数にコピーできるようにします。ヒューマンタスクが完了すると、値がコピーされます。ヒューマンタスクには結果変数 "Result" があり、これにはヒューマンアクターが返すデータが含まれています。変数 "ActorId" には、タスクを実際に実行するアクターの ID が含まれています。
10.2.2. 動的なヒューマンタスクプロパティ
- #{expression}
- String 型のタスクパラメーターの場合、#{expression} を使用して文字列に任意の式の値を埋め込むことができます。例えば、タスクに関連するコメントが "Please review this request from user #{user}" であったとします (この user はプロセス内の変数です)。 #{user} は、特定のプロセスインスタンスの実際のユーザー名で置き換えられます。#{expression} の値は、ヒューマンタスクが作成されると解決され、 #{...} は解決後の toString() 値で置き換えられます。この指揮は、単に変数の名前 (この場合変数の値で解決される) ですが、より高度な MVEL 式も利用可能です。例えば、#{person.name.firstname} を式として使用することもできます。この方法は String パラメーターにのみ仕様することができる点に注意してください。その他のパラメーターは、パラメーターマッピングを使用して、そのパラメーターに値をマッピングする必要があります。
- パラメーターマッピング
- プロセス変数の値 (または変数から取得した値) はタスクパラメーターにマッピングすることができます。例えば、プロセス内の変数が ID となっているユーザーにタスクを割り当てる必要がある場合、このタスクは ID 変数をパラメーター Actorid にマッピングすることで完了できるようになります。
10.2.3. ユーザーとグループの割り当て
10.2.4. 標準のヒューマンロール
- Task Initiator - タスクインスタンスを作成します。
- Task Stakeholders - タスクインスタンスの結果を担当します。
- Potential Owners - タスクを受け取りそのタスクを完了することができます。
- Actual Owner - 実際にタスクを実行します。
- Excluded Owners - タスクを準備、開始できません。
- Business Administrators - Task Stakeholders ロールを実行しますが、タスク型レベルで行います。
- Notification recipients - タスクに関連する通知を受領します。
注記
10.2.5. タスクのエスカレーションと通知
- 開始されていない (READY または RESERVED)
- 完了されていない (IN_PROGRESS)

- Users。この属性は、エスカレーション時にタスクを割り当てるべき、コンマ区切りのユーザー一覧です。この属性の許容値は、文字列の値と #{user-id} 式です。
- Groups。この属性は、エスカレーション時にタスクを割り当てるべき、コンマ区切りのユーザー一覧です。この属性の許容値は、文字列の値と #{group-id} 式です。
- Expires At。この属性は、エスカレーションを行うべき時間を定義します。タイマーと同様に時間の規格 (2m, 4h, 6d, など) で定義する必要があります。この属性の許容値は、文字列の値と #{expiresAt} 式です。
- Type。この属性は、エスカレーションを行うべきタスクのステータスのタイプを特定します (not-started | not-completed)。
- 開始されていない (READY または RESERVED)
- 完了されていない (IN_PROGRESS)

- Type。この属性は、エスカレーションを行うべきタスクのステータスのタイプを特定します (not-started | not-completed)。
- Expires At。この時間定義のプロパティは、エスカレーションを行うべき時間を特定します。タイマーと同様に時間の規格 (2m, 4h, 6d, など) で定義する必要があります。このプロパティの許容値は、文字列の値と #{expiresAt} 式です。
- From。E-メールメッセージの From フィールドで使用する、任意のユーザーまたはグループ ID、許容値は文字列と式です。
- To Users。通知の受信者となるユーザーの ID (コンマ区切りのリスト)。
- To Groups。通知の受信者となるグループの ID (コンマ区切りのリスト)。
- Reply To、通知の返信を受け取るべき任意のユーザーまたはグループ ID。
- Subject。通知の件名。許容値は文字列と式となっています。
- Body。通知の内容。許容値は文字列と式となっています。
- taskId: タスクインスタンスの内部 ID
- processInstanceId: タスクが所属するプロセスインスタンスの内部 ID
- workItemId: このタスクを作成する作業アイテムの内部 ID
- processSessionId: ランタイムエンジンのセッション内部 ID
- owners: タスクの Potential Owner となるユーザー/グループの一覧
- doc: 定期的なタスクの変数を含むマップ
<html><body><b>${owners[0].id} you have been assigned to a task (task-id ${taskId})</b><br> You can access it in your task <a href="http://localhost:8080/jbpm-console/app.html#errai_ToolSet_Tasks;Group_Tasks.3">inbox</a><br/> Important technical information that can be of use when working on it<br/> - process instance id - ${processInstanceId}<br/> - work item id - ${workItemId}<br/><hr/> Here are some task variables available: <ul><li>ActorId = ${doc['ActorId']}</li><li>GroupId = ${doc['GroupId']}</li><li>Comment = ${doc['Comment']}</li></ul><hr/> Here are all potential owners for this task: <ul> $foreach{orgEntity : owners} <li>Potential owner = ${orgEntity.id}</li> $end{} </ul><i>Regards</i></body></html>
10.2.6. データマッピング
10.2.6.1. データマッピング
10.2.6.2. タスクパラメーター
10.2.6.3. タスクの結果
10.2.7. スイムレーン
Swimlane
パラメーターの値としてスイムレーンの名前を指定します。
10.2.8. データベースからのタスクの削除
例10.1 イベントリスナーのアタッチ
TasksAdmin admin = new TaskService(...).createTaskAdmin(); StatefulKnowledgeSession ksession = ... ksession.addEventListener(new TaskCleanUpProcessEventListener(admin));
10.3. ヒューマンタスクサービス
10.3.1. ヒューマンタスクサービス
10.3.2. タスクのライフサイクル
- タスクが作成され、「Created」の段階で開始されます。
- このタスクは自動的に「Ready」の段階に移行され、タスクを請求できるユーザーのタスク一覧に表示されます。
- ユーザーがタスクを請求します。ここでステータスは「Reserved」に設定されます。
- ユーザーがタスクを開始 (および実行) します。ここでステータスは「InProgress」に変更されます。
- ユーザーがタスクを完了して、タスクの結果データが特定されます。ここでステータスは「Completed」に変更されます。ユーザーがタスクを完了できない場合、応答に問題があると通知され (関連の問題データなど)、ステータスは「Failed」に変更されます。
- 別のユーザーにタスクを割り当てるようにタスクを委譲、移行。
- タスクを呼び出し。タスクを請求した後、ユーザーはタスクを呼び出し、そのタスクを請求できるユーザーすべてが請求できる状態にします。
- タスクを一時的に停止、再開。
- 進行中のタスクを停止。
- タスクを省略 (タスクが skippable と指定されている場合)。この場合はタスクは実行されません。
10.3.3. ヒューマンタスクサービスの統合
StatefulKnowledgeSession ksession = ...; ksession.getWorkItemManager().registerWorkItemHandler("Human Task", new CommandBasedHornetQWSHumanTaskHandler());
10.3.4. ヒューマンタスクサービスとの対話
public void start( long taskId, String userId, TaskOperationResponseHandler responseHandler ) public void stop( long taskId, String userId, TaskOperationResponseHandler responseHandler ) public void release( long taskId, String userId, TaskOperationResponseHandler responseHandler ) public void suspend( long taskId, String userId, TaskOperationResponseHandler responseHandler ) public void resume( long taskId, String userId, TaskOperationResponseHandler responseHandler ) public void skip( long taskId, String userId, TaskOperationResponseHandler responseHandler ) public void delegate( long taskId, String userId, String targetUserId, TaskOperationResponseHandler responseHandler ) public void complete( long taskId, String userId, ContentData outputData, TaskOperationResponseHandler responseHandler ) ...
- taskId: タスクの ID。通常、ユーザーインターフェースのユーザータスク一覧で現在選択されているタスクから抽出されます。
- userId: アクションを実行するユーザーの ID。これは、アプリケーションにログインしているユーザーの ID となっています。
- responseHandler: タスクサービスとの通信は非同期であるため、結果が出ると通知がいくように応答ハンドラーを使用する必要があります。
//Use UUID.randomUUID() to ensure the HornetQ Connector has a unique name TaskClient client = new TaskClient(new HornetQTaskClientConnector("HornetQConnector" + UUID.randomUUID(), new HornetQTaskClientHandler(SystemEventListenerFactory.getSystemEventListener()))); client.connect("127.0.0.1", 5446); CommandBasedHornetQWSHumanTaskHandler handler = new CommandBasedHornetQWSHumanTaskHandler(ksession); handler.setClient(client); handler.connect(); ksession.getWorkItemManager().registerWorkItemHandler("Human Task", handler); // adding a task BlockingAddTaskResponseHandler addTaskResponseHandler = new BlockingAddTaskResponseHandler(); Task task = ...; client.addTask( task, null, addTaskResponseHandler ); long taskId = addTaskResponseHandler.getTaskId(); // getting tasks for user "bobba" BlockingTaskSummaryResponseHandler taskSummaryResponseHandler = new BlockingTaskSummaryResponseHandler(); client.getTasksAssignedAsPotentialOwner("bobba", "en-UK", taskSummaryResponseHandler); List<TaskSummary> tasks = taskSummaryResponseHandler.getResults(); // starting a task BlockingTaskOperationResponseHandler responseHandler = new BlockingTaskOperationResponseHandler(); client.start( taskId, "bobba", responseHandler ); responseHandler.waitTillDone(1000); // completing a task responseHandler = new BlockingTaskOperationResponseHandler(); client.complete( taskId, "bobba".getId(), null, responseHandler ); responseHandler.waitTillDone(1000);
10.3.5. ユーザーとグループの割り当て
EntityManagerFactory emf = Persistence.createEntityManagerFactory("org.jbpm.task"); TaskService taskService = new TaskService(emf, SystemEventListenerFactory.getSystemEventListener()); TaskServiceSession taskSession = taskService.createSession(); // now register new users and groups taskSession.addUser(new User("userA")); taskSession.addGroup(new Group("groupA"));
jbpm-human-task.war/WEB-INF/web.xml
ファイルにリストアップする必要があります。デフォルトの実装 org.jbpm.task.service.DefaultUserGroupCallbackImpl
は、全ユーザーを全グループに割り当てます。これはテスト目的で提供されています。
jbpm-human-task.war/WEB-INF/web.xml
を開き、以下の例にあるようにクラスを追加します。
<!-- use org.jbpm.task.service.DefaultUserGroupCallbackImpl to configure sample user group callback for demo purpose--><init-param><param-name>user.group.callback.class</param-name><param-value>org.jbpm.task.service.DefaultUserGroupCallbackImpl</param-value></init-param>
server/profile/deploy/jbpm-human-task.war/WEB-INF/classes/org/jbpm/task/servlet/
ディレクトリにある LoadUsers.mvel と LoadGroups.mvel 設定ファイルに定義されているようにユーザーとグループを自動的に追加します。
10.3.6. ヒューマンタスクサービスの開始
org.jbpm.task.service.TaskService taskService = new org.jbpm.task.service.TaskService( emf, SystemEventListenerFactory.getSystemEventListener()); TaskServiceSession taskServiceSession = taskService.createSession(); //adding users to TaskServiceSession taskServiceSession.addUser(new User("Administrator")); taskServiceSession.addUser(new User("jsmith")); LocalTaskService localTaskService = new LocalTaskService( taskService ); humanTaskHandler = new SyncWSHumanTaskHandler( localTaskService, ksession ); humanTaskHandler.setLocal( true ); humanTaskHandler.connect(); ksession.getWorkItemManager().registerWorkItemHandler( "Human Task", humanTaskHandler ); //using HT API ... List<TaskSummary> tasks = localTaskService.getTasksAssignedAsPotentialOwner("jsmith", "en-US");
hibernate.hbm2ddl.auto
プロパティの値として create
を指定すると、サーバーを再起動するたびに jBPM スキーマが再作成されていまいます。インデックスは 2 回以上作成するべきではなく、この機能は無効する必要があります。スキーマを作成した後に hibernate.hbm2ddl.auto プロパティの部分にコメントタグを設定してください。
<!-- <property name="hibernate.hbm2ddl.auto" value="create" /> -->
<?xml version="1.0" encoding="UTF-8" standalone="yes"?><persistence version="1.0" xsi:schemaLocation= "http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd http://java.sun.com/xml/ns/persistence/orm http://java.sun.com/xml/ns/persistence/orm_1_0.xsd" xmlns:orm="http://java.sun.com/xml/ns/persistence/orm" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/persistence"><persistence-unit name="org.jbpm.task"><provider>org.hibernate.ejb.HibernatePersistence</provider><class>org.jbpm.task.Attachment</class><class>org.jbpm.task.Content</class><class>org.jbpm.task.BooleanExpression</class><class>org.jbpm.task.Comment</class><class>org.jbpm.task.Deadline</class><class>org.jbpm.task.Comment</class><class>org.jbpm.task.Deadline</class><class>org.jbpm.task.Delegation</class><class>org.jbpm.task.Escalation</class><class>org.jbpm.task.Group</class><class>org.jbpm.task.I18NText</class><class>org.jbpm.task.Notification</class><class>org.jbpm.task.EmailNotification</class><class>org.jbpm.task.EmailNotificationHeader</class><class>org.jbpm.task.PeopleAssignments</class><class>org.jbpm.task.Reassignment</class><class>org.jbpm.task.Status</class><class>org.jbpm.task.Task</class><class>org.jbpm.task.TaskData</class><class>org.jbpm.task.SubTasksStrategy</class><class>org.jbpm.task.OnParentAbortAllSubTasksEndStrategy</class><class>org.jbpm.task.OnAllSubTasksEndParentEndStrategy</class><class>org.jbpm.task.User</class><properties><property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect"/><property name="hibernate.connection.driver_class" value="org.h2.Driver"/><property name="hibernate.connection.url" value="jdbc:h2:mem:mydb" /><property name="hibernate.connection.username" value="sa"/><property name="hibernate.connection.password" value="sasa"/><property name="hibernate.connection.autocommit" value="false" /><property name="hibernate.max_fetch_depth" value="3"/><property name="hibernate.hbm2ddl.auto" value="create" /><property name="hibernate.show_sql" value="true" /></properties></persistence-unit></persistence>
10.3.7. Web アプリケーションとしてのヒューマンタスクサービス開始
jbpm-human-task-war/WEB-INF/
ディレクトリにある web.xml
で設定します。
- task.persistence.unit: EntityManagerFactory (デフォルト org.jbpm.task) を構築する際に使用する永続ユニットの名前
- user.group.callback.class: ユーザーとグループを解決するために使用する UserGroupCallback インターフェースの実装 (デフォルト DefaultUserGroupCallbackImpl。テスト目的でのみ提供)
- escalated.deadline.handler.class: エスカレーションと通知を処理する際に使用する EscalatedDeadlineHandler インターフェースの実装 (デフォルト DefaultEscalatedDeadlineHandler)
- user.info.class: E-メールアドレスや希望言語などユーザー/グループの情報を解決すうrために使用する UserInfo インターフェースの実装
- load.users: これはユーザー情報を持つタスクサーバー データベースをを最初に生成する際に使用するファイルの場所を指定します。利用可能なファイルの種類は MVEL と properties で、接尾語は .mvel or .properties とします。このファイルはクラスパス (接頭辞 classpath:) か有効な URL に設置する必要があります。注記: カスタムのユーザーファイルを使用する場合は、管理者ユーザーが設置されている必要があります。
- load.groups: これはグループ情報を持つタスクサーバー データベースをを最初に生成する際に使用するファイルの場所を指定します。利用可能なファイルの種類は MVEL と properties で、接尾語は .mvel or .properties とします。このファイルはクラスパス (接頭辞 classpath:) か有効な URL に設置する必要があります。注記: カスタムのユーザーファイルを使用する場合は、管理者ユーザーが設置されている必要があります。
- active.config: どのトランスポートを Task Server に設定するか制御する主要パラメーター。デフォルトは、HornetQ となっていますが、Mina や JMS にも対応しています。
- mina.host: Apache Mina サーバーをバインドするために使用するホスト/ip アドレス (localhost)
- mina.port: Apache Mina サーバーをバインドするために使用するポート (default 9123)
- hornetq.port: HornetQ サーバーをバインドするために使用するポート (default 5446)
- JMSTaskServer.connectionFactory: ルックアップする際の QueueConnectionFactory の JNDI 名 (デフォルトなし)
- JMSTaskServer.transacted : JMS セッションでトランザクションがあるかどうかを指定する boolean フラグ (デフォルトなし)
- JMSTaskServer.acknowledgeMode: 応答確認モード (デフォルト DUPS_OK_ACKNOWLEDGE).
- JMSTaskServer.queueName: JMS キューの名前 (デフォルトなし)
- JMSTaskServer.responseQueueName: JMS 応答キューの名前 (デフォルトなし)
10.4. ヒューマンタスクの永続性
10.4.1. ヒューマンタスクの永続性

図10.1 ヒューマンタスクサービスのデータモデル
task
エンティティ: タスクの主要情報を表します (上記の ERD の右側を参照)。deadline
、escalation
、notification
エンティティ: タスクの締め切りとエスカレーションおよびその締め切りに関連付けられた通知 (上記の ERD の左側を参照)。
i18ntext
と organizationalentity
の 2 つがあります。
i18ntext
エンティティは、名前やユーザーが入力した説明などのテキスト (言語関連の場合もあり) を格納するために使用します。organizationalentity
エンティティはユーザーを表します。
-1
または 0
の値が入ります。
10.4.2. タスク関連のエンティティ
task
エンティティには、タスクに関する情報が含まれています。
表10.1 タスク
フィールド | 説明 | Null | 外部キー |
---|---|---|---|
id | タスクアイデンティティのプライマリキー | ![]() | ![]() |
priority | タスクの優先順位 | ![]() | ![]() |
allowedtodelegate | このタスクの委譲先のグループ | ![]() | ![]() |
status | タスクのステータス | ![]() | ![]() |
previousstatus | タスクの以前のステータス | ![]() | ![]() |
actualowner_id | タスクを所有する組織エンティティの ID | ![]() | ![]() |
createdby_id | タスクを作成した組織エンティティの ID | ![]() | ![]() |
createdon | タスクが作成された時間を示すタイムスタンプ | ![]() | ![]() |
activationtime | タスクがアクティベートされた時間を示すタイムスタンプ | ![]() | ![]() |
expirationtime | タスクが失効する時間を示すタイムスタンプ | ![]() | ![]() |
skipable | このタスクを省略可能かどうか | ![]() | ![]() |
workitemid | このタスクに関連付けられた作業アイテムの ID (jBPM コアスキーマ参照) | ![]() | ![]() |
processinstanceid | このタスクに関連付けられたプロセスインスタンスの ID (jBPM コアスキーマ参照) | ![]() | ![]() |
documentaccesstype | タスクに関連付けられたドキュメントにアクセスする方法 | ![]() | ![]() |
documenttype | ドキュメント内のデータ型 | ![]() | ![]() |
documentcontentid | ドキュメントデータを含む content エンティティの ID | ![]() | ![]() |
outputaccesstype | タスクに関連付けられた出力ドキュメントにアクセスする方法 | ![]() | ![]() |
outputtype | 出力ドキュメント内のデータ型 | ![]() | ![]() |
outputcontentid | 出力ドキュメントデータを含む content エンティティの ID | ![]() | ![]() |
faultname | フォルトが発生した場合に生成されるフォルト名 | ![]() | ![]() |
faultaccesstype | フォルトに関連付けられたドキュメントにアクセスする方法 | ![]() | ![]() |
faulttype | フォルトドキュメント内のデータ型 | ![]() | ![]() |
faultcontentid | フォルトドキュメントデータを含む content エンティティの ID | ![]() | ![]() |
parentid | 親タスクの ID | ![]() | ![]() |
processid | 関連プロセスの名前 (ID) | ![]() | ![]() |
processsessionid | 関連の (ナレッジ) セッションの ID | ![]() | ![]() |
taskinitiator_id | タスクを作成した組織エンティティの ID | ![]() | ![]() |
subtasksstrategy
エンティティは、親やサブタスクが終了した際にどのように反応すべきか表現するストラテジーを保存するために使用します。
表10.2 SubTasksStrategy
フィールド | 説明 | Null | 外部キー |
---|---|---|---|
id | プライマリキー | ![]() | ![]() |
dtype | 識別子カラム | ![]() | ![]() |
name | ストラテジーの名前 | ![]() | ![]() |
task_id | 関連する task のプライマリキー | ![]() | ![]() |
organizationalentity
エンティティは、そのタスクの一部を別の人に割り当てることを表現するために拡張します。
表10.3 OrganizationalEntity
フィールド | 説明 | Null |
---|---|---|
id | プライマリキー | ![]() |
dtype | 識別子カラム | ![]() |
attachment
エンティティは、タスクに追加された添付を表現します。
表10.4 Attachment
フィールド | 説明 | Null | 外部キー |
---|---|---|---|
id | プライマリキー | ![]() | ![]() |
name | 添付の (ファイルの) 名前 | ![]() | ![]() |
accesstype | 添付データにアクセスする方法 | ![]() | ![]() |
attachedat | 添付データがタスクに添付された時間 | ![]() | ![]() |
attachment_size | 添付のサイズ (バイト単位) | ![]() | ![]() |
attachmentcontentid | 添付のローデータを保存する content エンティティの ID | ![]() | ![]() |
contenttype | 添付データの MIME タイプ | ![]() | ![]() |
attachedby_id | データを添付した organizationalentity の ID | ![]() | ![]() |
taskdata_attachments_id | この添付データが所属する task エンティティの ID | ![]() | ![]() |
task_comment
エンティティは、タスクに追加されたコメントを表現します。
表10.5 task_comment
フィールド | 説明 | Null | 外部キー |
---|---|---|---|
id | プライマリキー | ![]() | ![]() |
addedat | タスクに追加されたコメントの時間のタイムスタンプ | ![]() | ![]() |
text | コメントの文字 | ![]() | ![]() |
addedby_id | 関連する organizationalentity エンティティのプライマリキー | ![]() | ![]() |
taskdata_comments_id | 関連する task エンティティのプライマリキー | ![]() | ![]() |
delegation_delegates
の表は、task
エンティティと organizationalentity
との関係についてまとめた表です。
表10.6 delegation_delegates
フィールド | 説明 | Null | 外部キー |
---|---|---|---|
task_id | 関連する task のプライマリキー | ![]() | ![]() |
entity_id | 関連する organizationalentity のプライマリキー | ![]() | ![]() |
peopleassignments_stakeholders
の表は、organizationalentity
エンティティが特定タスクの task stakeholders について記載しまとめた表です。
表10.7 peopleassignments_stakeholders
フィールド | 説明 | Null | 外部キー |
---|---|---|---|
task_id | 関連する task エンティティのプライマリキー | ![]() | ![]() |
entity_id | 関連する organizationalentity エンティティのプライマリキー | ![]() | ![]() |
peopleassignments_potowners
の表は、organizationalentity
エンティティが特定タスクの potential owners であることを記述し、まとめた表です。
表10.8 peopleassignments_potowners
フィールド | 説明 | Null | 外部キー |
---|---|---|---|
task_id | 関連する task エンティティのプライマリキー | ![]() | ![]() |
entity_id | 関連する organizationalentity エンティティのプライマリキー | ![]() | ![]() |
peopleassignments_exclowners
の表は、organizationalentity
エンティティが特定タスクの excluded owners であることを記述し、まとめた表です。
表10.9 peopleassignments_exclowners
フィールド | 説明 | Null | 外部キー |
---|---|---|---|
task_id | 関連する task エンティティのプライマリキー | ![]() | ![]() |
entity_id | 関連する organizationalentity エンティティのプライマリキー | ![]() | ![]() |
peopleassignments_bas
の表は、organizationalentity
エンティティが特定タスクの business administrators について記載しまとめた表です。
表10.10 peopleassignments_bas
フィールド | 説明 | Null | 外部キー |
---|---|---|---|
task_id | 関連する task エンティティのプライマリキー | ![]() | ![]() |
entity_id | 関連する organizationalentity エンティティのプライマリキー | ![]() | ![]() |
peopleassignments_recipients
の表は、organizationalentity
エンティティが特定タスクの notification recipients について記載しまとめた表です。
表10.11 peopleassignments_recipients
フィールド | 説明 | Null | 外部キー |
---|---|---|---|
task_id | 関連する task エンティティのプライマリキー | ![]() | ![]() |
entity_id | 関連する organizationalentity エンティティのプライマリキー | ![]() | ![]() |
10.4.3. 締め切り、エスカレーション、通知関連のエンティティ
deadline
エンティティは、タスクの締め切りについて表しています。
表10.12 deadline
フィールド | 説明 | Null | 外部キー |
---|---|---|---|
id | プライマリキー | ![]() | ![]() |
deadline_date | 締切日 | ![]() | ![]() |
escalated | 締め切りがエスカレーションされたかどうか | ![]() | ![]() |
deadlines_startdeadline_id | この締め切りを締め切りの最初として使用する関連の task エンティティ ID | ![]() | ![]() |
deadlines_enddeadline_id | この締め切りを締め切りの最後として使用する関連の task エンティティ ID | ![]() | ![]() |
escalation
エンティティは、特定の締め切りに対して取るべきエスカレーションアクションについて説明しています。
表10.13 escalation
フィールド | 説明 | Null | 外部キー |
---|---|---|---|
id | プライマリキー | ![]() | ![]() |
name | エスカレーションイベントの名前 | ![]() | ![]() |
deadline_escalation_id | 関連の deadline エンティティの ID | ![]() | ![]() |
booleanexpression
エンティティは boolean を評価する式を表します。これらの式を使用して制約を適用するべきか決定します。
表10.14 booleanexpression
フィールド | 説明 | Null | 外部キー |
---|---|---|---|
id | プライマリキー | ![]() | ![]() |
expression | 式のテキスト | ![]() | ![]() |
type | 式のタイプ | ![]() | ![]() |
escalation_constraints_id | 式で利用したエスカレーション制約の ID | ![]() | ![]() |
notification
エンティティは、エスカレーションアクションにより生成された通知を表します。
表10.15 notification
フィールド | 説明 | Null | 外部キー |
---|---|---|---|
id | プライマリキー | ![]() | ![]() |
dtype | 識別子カラム | ![]() | ![]() |
priority | 通知の優先順位 | ![]() | ![]() |
escalation_notifications_id | 関連の escalation エンティティの ID | ![]() | ![]() |
email_header
エンティティは、通知の一部として送信された e-メールを表します。
表10.16 email_header
フィールド | 説明 | Null |
---|---|---|
id | プライマリキー | ![]() |
fromaddress | E-メールが送信された e-メールアドレス | ![]() |
replytoaddress | e-メールで使用される返信先アドレス | ![]() |
language | E-メールが書かれている言語 | ![]() |
subject | e-メールの件名 | ![]() |
body | e-メールの内容 | ![]() |
notification_email_header
の表は、どの email_header
エンティティが通知の一部であるか記載、基準をまとめています。
表10.17 notification_email_header
フィールド | 説明 | Null | 外部キー |
---|---|---|---|
notification_id | mapkey と併せて、このフィールドはプロパティキーの一部です。このフィールドは email_header が関連付けられている notification エンティティを参照します。 | ![]() | ![]() |
mapkey | このフィールドは、notification_id と併せてプロパティキーの一部となります。このフィールドは email_header が関連付けられているタイプを表します。 | ![]() | ![]() |
emailheaders_id | 関連付けられている email_header エンティティの ID | ![]() | ![]() |
reassignment
エンティティは、エスカレーション関連の再割当てについて表しています。
表10.18 reassignment
フィールド | 説明 | Null | 外部キー |
---|---|---|---|
id | プライマリキー | ![]() | ![]() |
escalation_reassignments_id | 関連の escalation エンティティの ID | ![]() | ![]() |
reassignments_potentialowners
の表は、エスカレーションの一部としてタスクの再割当てが行われた場合、どの organizationalentity
エンティティが Potential Owners となるかを表しています。
表10.19 reassignment_potentialowners
フィールド | 説明 | Null | 外部キー |
---|---|---|---|
task_id | 関連の reassignment エンティティのプライマリキー | ![]() | ![]() |
entity_id | 関連する organizationalentity エンティティのプライマリキー | ![]() | ![]() |
notification_bas
の表は、notification
によりどの business administrators が通知されるか説明しまとめています。
表10.20 notification_bas
フィールド | 説明 | Null | 外部キー |
---|---|---|---|
task_id | 関連する notification エンティティのプライマリキー | ![]() | ![]() |
entity_id | 関連する organizationalentity エンティティのプライマリキー | ![]() | ![]() |
notification_recipients
の表は、どの recipients
エンティティが notification
を受け取るかを記載しています。
表10.21 notification_recipients
フィールド | 説明 | Null | 外部キー |
---|---|---|---|
task_id | 関連する notification エンティティのプライマリキー | ![]() | ![]() |
entity_id | 関連する organizationalentity エンティティのプライマリキー | ![]() | ![]() |
content
エンティティは、ドキュメント、出力ドキュメント、フォルト、その他のオブジェクトを表しています。
表10.22 content
フィールド | 説明 | Null |
---|---|---|
id | プライマリキー | ![]() |
content | コンテンツデータ | ![]() |
i18ntext
エンティティは、その他のエンティティが文字フィールドを保存するために使用します。deadline
、notification
、reassignment
、task
エンティティは、このエンティティを使用して説明件名、名前、その他のドキュメントを保存します。
表10.23 i18ntext
フィールド | 説明 | Null | 外部キー |
---|---|---|---|
id | プライマリキー | ![]() | ![]() |
language | テキストの言語 | ![]() | ![]() |
text | テキスト | ![]() | ![]() |
task_subjects_id | この件名が参照する task エンティティの ID | ![]() | ![]() |
task_names_id | この名前が参照する task エンティティの ID | ![]() | ![]() |
task_descriptions_id | この説明が参照する task エンティティの ID | ![]() | ![]() |
reassignment_documentation_id | このドキュメントが参照する reassignment エンティティの ID | ![]() | ![]() |
notification_subjects_id | この件名が参照する notification エンティティの ID | ![]() | ![]() |
notification_names_id | この名前が参照する notification エンティティの ID | ![]() | ![]() |
notification_documentation_id | このドキュメントが参照する notification エンティティの ID | ![]() | ![]() |
notification_descriptions_id | この説明が参照する notification エンティティの ID | ![]() | ![]() |
deadline_documentation_id | このドキュメントが参照する deadline エンティティの ID | ![]() | ![]() |
第11章 テストおよびデバッグ
11.1. 単体テスト
11.1.1. 単体テスト
- 一定のプロセスで新規ナレッジベースとセッションを作成するための Helper メソッド
- 確認するための Assert ステートメント
- プロセスインスタンスのステータス (active、completed、aborted)
- どのノードインスタンスが現在アクティブであるか
- どのノードがトリガーされたか (辿ってきたパスの確認)
- 変数の値

図11.1 Hello World プロセスの例
例11.1 junit テストの例
public class MyProcessTest extends JbpmJUnitTestCase { public void testProcess() { // create your session and load the given process(es) StatefulKnowledgeSession ksession = createKnowledgeSession("sample.bpmn"); // start the process ProcessInstance processInstance = ksession.startProcess("com.sample.bpmn.hello"); // check whether the process instance has completed successfully assertProcessInstanceCompleted(processInstance.getId(), ksession); // check whether the given nodes were executed during the process execution assertNodeTriggered(processInstance.getId(), "StartProcess", "Hello", "EndProcess"); } }
11.1.2. セッション作成のための Helper メソッド
- createKnowledgeBase(String... process):
- 任意のファイル名 (クラスパスからロード) にある全プロセスを含む新しいナレッジベースを返します。
- createKnowledgeBase(Map<String, ResourceType> resources):
- 任意のファイル名 (クラスパスからロード) からの全リソースを含む新しいナレッジベースを返します。
- createKnowledgeBaseGuvnor(String... packages):
- 任意のパッケージの Guvnor (プロセスレポジトリ) からロードされた全プロセスを含む新しいナレッジベースを返します。
- createKnowledgeSession(KnowledgeBase kbase):
- 任意のナレッジベースから新しいステートフルナレッジセッションを作成します。
- restoreSession(StatefulKnowledgeSession ksession, boolean noCache):
- データベースからこのセッションを完全にリストアします。致命的な問題が発生した場合や試験的なリカバリをシミュレーションするためにセッションを再作成する際に利用可能です。noCache が true の場合、既存の永続キャッシュを使用せずにデータをリストアします。
11.1.3. アサーション
- assertProcessInstanceActive(long processInstanceId, StatefulKnowledgeSession ksession):
- 指定の ID のプロセスインスタンスがまだアクティブな状態にあるかどうかを確認します。
- assertProcessInstanceCompleted(long processInstanceId, StatefulKnowledgeSession ksession):
- 指定の ID のプロセスインスタンスが正常に完了したかどうかを確認します。
- assertProcessInstanceAborted(long processInstanceId, StatefulKnowledgeSession ksession):
- 指定の ID のプロセスインスタンスが中断されたかどうかを確認します。
- assertNodeActive(long processInstanceId, StatefulKnowledgeSession ksession, String... name):
- 指定の ID のプロセスインスタンスに指定のノード名を持つアクティブなノードが最低 1 つ含まれているかどうかを確認します。
- assertNodeTriggered(long processInstanceId, String... nodeNames):
- 指定のノード名を持つプロセスインスタンスを実行中にノードインスタンスが (すでにアクティブな状態でなくなっていても) トリガーされたかどうか、1 つずつ指定のノード名を確認します。
- getVariableValue(String name, long processInstanceId, StatefulKnowledgeSession ksession):
- 指定のプロセスインスタンスから指定の名前を持つ変数の値をリトリーブします。その後プロセス変数の値をチェックするために利用することができます。
11.1.4. 外部サービスとの統合のテスト

public void testProcess2() { // create your session and load the given process(es) StatefulKnowledgeSession ksession = createKnowledgeSession("sample2.bpmn"); // register a test handler for "Email" TestWorkItemHandler testHandler = new TestWorkItemHandler(); ksession.getWorkItemManager().registerWorkItemHandler("Email", testHandler); // start the process ProcessInstance processInstance = ksession.startProcess("com.sample.bpmn.hello2"); assertProcessInstanceActive(processInstance.getId(), ksession); assertNodeTriggered(processInstance.getId(), "StartProcess", "Email"); // check whether the email has been requested WorkItem workItem = testHandler.getWorkItem(); assertNotNull(workItem); assertEquals("Email", workItem.getName()); assertEquals("me@mail.com", workItem.getParameter("From")); assertEquals("you@mail.com", workItem.getParameter("To")); // notify the engine the email has been sent ksession.getWorkItemManager().abortWorkItem(workItem.getId()); assertProcessInstanceAborted(processInstance.getId(), ksession); assertNodeTriggered(processInstance.getId(), "Gateway", "Failed", "Error"); }
11.1.5. 永続性の設定
public class MyProcessTest extends JbpmJUnitTestCase { public MyProcessTest() { // configure this test to use persistence super(true); setPersistence(true); } ...
11.2. デバッグ
11.2.2. プロセスインスタンスのビュー
例11.2 プロセスインスタスビューのサンプル

11.2.3. ヒューマンタスクビュー
例11.3 ヒューマンタスクビューのサンプル

11.2.4. 監査ビュー
例11.4 スレッドファイルロガー
KnowledgeRuntimeLogger logger = KnowledgeRuntimeLoggerFactory .newThreadedFileLogger(ksession, "logdir/mylogfile", 1000); // do something with the session here logger.close();

第12章 ビジネスアクティビティの監視
12.1. ビジネスアクティビティの監視
重要
第13章 統合
13.2. OSGi
- jbpm-flow
- jbpm-flow-builder
- jbpm-bpmn2
例13.1 OSGi の例
ServiceReference serviceRef = bundleContext.getServiceReference( ServiceRegistry.class.getName() ); ServiceRegistry registry = (ServiceRegistry) bundleContext.getService( serviceRef ); KnowledgeBuilderFactoryService knowledgeBuilderFactoryService = registry.get( KnowledgeBuilderFactoryService.class ); KnowledgeBaseFactoryService knowledgeBaseFactoryService = registry.get( KnowledgeBaseFactoryService.class ); ResourceFactoryService resourceFactoryService = registry.get( ResourceFactoryService.class ); KnowledgeBuilderConfiguration kbConf = knowledgeBuilderFactoryService.newKnowledgeBuilderConfiguration( null, getClass().getClassLoader() ); KnowledgeBuilder kbuilder = knowledgeBuilderFactoryService.newKnowledgeBuilder( kbConf ); kbuilder.add( resourceFactoryService.newClassPathResource( "MyProcess.bpmn", Dummy.class ), ResourceType.BPMN2 ); KnowledgeBaseConfiguration kbaseConf = knowledgeBaseFactoryService.newKnowledgeBaseConfiguration( null, getClass().getClassLoader() ); KnowledgeBase kbase = knowledgeBaseFactoryService.newKnowledgeBase( kbaseConf ); kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() ); StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
13.3. Spring
例13.2 Spring 設定ファイルの例
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jbpm="http://drools.org/schema/drools-spring" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd http://drools.org/schema/drools-spring org/drools/container/spring/drools-spring-1.2.0.xsd><jbpm:kbase id="kbase"><jbpm:resources><jbpm:resource type="BPMN2" source="classpath:HelloWorld.bpmn2"/></jbpm:resources></jbpm:kbase><jbpm:ksession id="ksession" type="stateful" kbase="kbase" /></beans>
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("spring-conf.xml"); StatefulKnowledgeSession ksession = (StatefulKnowledgeSession) context.getBean("ksession"); ksession.startProcess("com.sample.HelloWorld");
<bean id="myObject" class="org.jbpm.sample.MyObject"><property name="session" ref="ksession" /></bean>
public class MyObject { private StatefulKnowledgeSession ksession; public void setSession(StatefulKnowledgeSession ksession) { this.ksession = ksession; } public void doSomething() { ksession.startProcess("com.sample.HelloWorld"); } }
13.4. Maven
手順13.1 Drools と jBPM jar ファイルのローカル Maven レポジトリへのインポート
- https://access.redhat.com の Red Hat カスタマーサポートポータルからデプロイ可能パッケージ (Zip ファイル) をダウンロードします。Downloads → Download your software → BRMS Platform を選択して、バージョンと JBoss BRMS 5.3.1 を選びます。
- Zip アーカイブを展開します。
jboss-brms-engine.zip
およびjboss-jbpm-engine.zip
アーカイブを展開します。- 以下の maven コマンドを実行して、Drools と jBPM jar ファイルをローカルの maven レポジトリにインポートします。
mvn install:install-file -Dfile=knowledge-api-5.3.1.BRMS.jar -DgroupId=org.drools -DartifactId=knowledge-api -Dversion=5.3.1.BRMS -Dpackaging=jar mvn install:install-file -Dfile=drools-core-5.3.1.BRMS.jar -DgroupId=org.drools -DartifactId=drools-core -Dversion=5.3.1.BRMS -Dpackaging=jar mvn install:install-file -Dfile=drools-compiler-5.3.1.BRMS.jar -DgroupId=org.drools -DartifactId=drools-compiler -Dversion=5.3.1.BRMS -Dpackaging=jar mvn install:install-file -Dfile=drools-decisiontables-5.3.1.BRMS.jar -DgroupId=org.drools -DartifactId=drools-decisiontables -Dversion=5.3.1.BRMS -Dpackaging=jar mvn install:install-file -Dfile=drools-templates-5.3.1.BRMS.jar -DgroupId=org.drools -DartifactId=drools-templates -Dversion=5.3.1.BRMS -Dpackaging=jar mvn install:install-file -Dfile=drools-persistence-jpa-5.3.1.BRMS.jar -DgroupId=org.drools -DartifactId=drools-persistence-jpa -Dversion=5.3.1.BRMS -Dpackaging=jar mvn install:install-file -Dfile=jbpm-flow-5.3.1.BRMS.jar -DgroupId=org.jbpm -DartifactId=jbpm-flow -Dversion=5.3.1.BRMS -Dpackaging=jar mvn install:install-file -Dfile=jbpm-flow-builder-5.3.1.BRMS.jar -DgroupId=org.jbpm -DartifactId=jbpm-flow-builder -Dversion=5.3.1.BRMS -Dpackaging=jar mvn install:install-file -Dfile=jbpm-bam-5.3.1.BRMS.jar -DgroupId=org.jbpm -DartifactId=jbpm-bam -Dversion=5.3.1.BRMS -Dpackaging=jar mvn install:install-file -Dfile=jbpm-bpmn2-5.3.1.BRMS.jar -DgroupId=org.jbpm -DartifactId=jbpm-bpmn2 -Dversion=5.3.1.BRMS -Dpackaging=jar mvn install:install-file -Dfile=jbpm-human-task-5.3.1.BRMS.jar -DgroupId=org.jbpm -DartifactId=jbpm-human-task -Dversion=5.3.1.BRMS -Dpackaging=jar mvn install:install-file -Dfile=jbpm-persistence-jpa-5.3.1.BRMS.jar -DgroupId=org.jbpm -DartifactId=jbpm-persistence-jpa -Dversion=5.3.1.BRMS -Dpackaging=jar mvn install:install-file -Dfile=jbpm-workitems-5.3.1.BRMS.jar -DgroupId=org.jbpm -DartifactId=jbpm-workitems -Dversion=5.3.1.BRMS -Dpackaging=jar
注記
上記の jar インポートファイルの一覧は完全ではありません。drools
、knowledge
、jbpm
すべての jar ファイルをインポートするようにしてください。
<?xml version="1.0" encoding="utf-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"><modelVersion>4.0.0</modelVersion><groupId>org.jbpm</groupId><artifactId>jbpm-maven-example</artifactId><name>jBPM Maven Project</name><version>1.0-SNAPSHOT</version><brms-version>5.3.1.BRMS<brms-version> ... <dependencies><!-- core dependencies --><dependency><groupId>org.drools</groupId><artifactId>knowledge-api</artifactId><version>${brms-version}</version></dependency><dependency><groupId>org.drools</groupId><artifactId>drools-core</artifactId><version>${brms-version}</version></dependency><dependency><groupId>org.mvel</groupId><artifactId>mvel2</artifactId><version>2.1.Beta6</version></dependency><dependency><groupId>com.thoughtworks.xstream</groupId><artifactId>xstream</artifactId><version>1.3.1</version></dependency><!-- required to compile DRL --><dependency><groupId>org.drools</groupId><artifactId>drools-compiler</artifactId><version>${brms-version}</version></dependency><dependency><groupId>org.eclipse.jdt.core.compiler</groupId><artifactId>ecj</artifactId><version>3.5.1</version></dependency><dependency><groupId>org.antlr</groupId><artifactId>antlr-runtime</artifactId><version>3.3</version><exclusions><exclusion><groupId>org.antlr</groupId><artifactId>stringtemplate</artifactId></exclusion></exclusions></dependency><!-- required to compile decision tables --><dependency><groupId>org.drools</groupId><artifactId>drools-decisiontables</artifactId><version>${brms-version}</version></dependency><dependency><groupId>org.drools</groupId><artifactId>drools-templates</artifactId><version>${brms-version}</version></dependency><dependency><groupId>net.sourceforge.jexcelapi</groupId><artifactId>jxl</artifactId><version>2.6.10</version></dependency><!-- required for jBPM5 processes --><dependency><groupId>org.jbpm</groupId><artifactId>jbpm-flow</artifactId><version>${brms-version}</version></dependency><dependency><groupId>org.jbpm</groupId><artifactId>jbpm-flow-builder</artifactId><version>${brms-version}</version></dependency><dependency><groupId>org.jbpm</groupId><artifactId>jbpm-bam</artifactId><version>${brms-version}</version></dependency><dependency><groupId>org.jbpm</groupId><artifactId>jbpm-bpmn2</artifactId><version>${brms-version}</version></dependency><dependency><groupId>org.jbpm</groupId><artifactId>jbpm-human-task</artifactId><version>${brms-version}</version></dependency><dependency><groupId>org.jbpm</groupId><artifactId>jbpm-persistence-jpa</artifactId><version>${brms-version}</version></dependency><dependency><groupId>org.jbpm</groupId><artifactId>jbpm-workitems</artifactId><version>${brms-version}</version></dependency><dependency><groupId>org.drools</groupId><artifactId>drools-persistence-jpa</artifactId><version>${brms-version}</version></dependency><dependency><groupId>com.google.protobuf</groupId><artifactId>protobuf-java</artifactId><version>2.4.1</version></dependency></dependencies></project>
付録A 改訂履歴
改訂履歴 | |||
---|---|---|---|
改訂 5.3.1-4.400 | 2013-10-31 | Rüdiger Landmann | |
| |||
改訂 5.3.1-4 | Mon Aug 26 2013 | Red Hat Content Services | |
|