3.5. アクティビティ
アクティビティとは、プロセスの実行中に行う必要のあるアクションのことです。各アクティビティには、内向き接続が 1 つと外向き接続が 1 つ含まれています。
各アクティビティにはノードを識別する ID と、ノードの名前を表示する名前があります。追加のプロパティは以下の表に記載しています。
表3.2 アクティビティ
アクティビティの種類 | 追加のプロパティ | 使用法 |
---|---|---|
スクリプトのタスク
![]() |
| スクリプトタスクは、このプロセスで実行すべきスクリプトを指しています。関連のアクションは、実行スべきこと、アクションのコーディングに使用する方言 (Java または MVEL)、実際のアクションコードを指定します。このコードは、変数や Global 変数にアクセスできます。また、事前定義されている変数 'kcontext' もあり、これは 'ProcessContext' オブジェクトを参照します (このオブジェクトを使用して現在の ProcessInstance または NodeInstance にアクセスできます。また変数の取得と設定や以下を使って ksession へアクセスできるように、このオブジェクトを使用することができます)。
kcontext.getKnowledgeRuntime())プロセス内でスクリプトタスクに到達すると、アクションを実行して次のノードに進みます。 |
ユーザータスク
![]() |
|
プロセスは、ヒューマンアクターにより実行する必要のあるタスクが関連します。ユーザータスクは、ヒューマンアクターにより完了されるアトミックタスクを指します。ユーザータスクはスイムレーンとあわせて使用して、複数のヒューマンタスクを同様のアクターに割り当てることができます。スイムレーンとヒューマンタスクに関する詳細情報は、ヒューマンタスクの章を参照してください。
|
サービスタスク
![]() |
| サービスタスクは、このプロセスで実行すべき作業の抽象ユニットを指します。プロセスエンジンの外で実行される作業はすべて、サービスタスクを使用して (宣言的な方法で) 表現する必要があります。様々な種類のサービス (例:e-メールの送信、メッセージのロギングなど) が事前定義されていますが、各種ドメイン固有サービスまたは作業アイテムを定義できます。詳細は、ドメイン固有プロセスの章を参照してください。 |
ビジネスルールタスク
![]() |
|
ビジネスルールタスクは、評価する必要のあるルールセットのことです。ルールは、Drools ルール形式を使用して別ファイルで定義します。ルールは、ルールのヘッダーで ruleflow-group 属性を使用することで、指定のルールフローグループの一部となります。プロセスでルールタスクに到達すると、エンジンは該当の ruleflow-group の一部であるルールの実行を開始します (あれば)。このルールフローグループにアクティブなルールがなくなると、次のノードに自動的に進み実行されます。つまり、ルールフローグループの実行中は、現在アクティブなルールフローグループに所属する新規アクティベーションをアジェンダに追加することができます。これは、他のルールがファクトに変更を加えるため発生します。ルールフローがすでにアクティブな場合、ルールフローグループはアクティブな状態を保ち、ルールフローグループでアクティブなルールがすべて終わってから、実行は次に継続されます。
|
組み込みサブプロセス
![]() |
|
サブプロセスとは、ノードコンテナーの役割を果たせるように他のノードを含めることができるノードです。これは、このサブプロセスノードの中にプロセスの一部を埋め込むだけでなく、このコンテナー内にある全ノードにアクセス可能な追加変数も定義できます。サブプロセスは、開始イベント 1 つと、1 つ以上の終了イベントが必要です。
|
再利用可能なサブプロセス
![]() |
|
再利用可能なサブプロセスは、プロセス内から別のプロセスを呼び出すという部分を指します。再利用可能なサブプロセスノードにプロセス内で到達すると、エンジンは、指定の ID を持つプロセスを開始します。
|
マルチインスタンスのサブプロセス
![]() |
|
インスタンスが複数あるサブプロセスは特殊なサブプロセスで、プロセス内にあるセグメントを複数回実行できます (ただしコレクション内のの要素ごとに 1 回)。埋め込みプロセスのフラグメントは、指定のコレクション内の要素でそれぞれ終了するまで待機してから次に進みます。コレクションの式が Null または空のコレクションと評価した場合、複数インスタンスのサブプロセスは直後に完了して次の外向き接続に進みます。
|
有効な Java コードであればどれでも、スクリプトノード内で使用することができます。スクリプトノード向けにコードを記述する際に注意する点:
- ビジネスユーザーが理解する必要のあるハイレベルのビジネスプロセスを定義する場合は、プロセス内にローレベルの実装詳細は含めないようにしてください。スクリプトタスクを使用して変数を操作することも可能ですが、サービスタスクのような他のコンセプトを使用してより高いレベルのより複雑な動作をモデリングすることもできます。
- スクリプトは、エンジンスレッドを使用してスクリプトを実行するため immediate でなければなりません。実行するまでに時間があくスクリプトは、非同期サービスタスクとしてモデリングする必要があります。
- スクリプトノード経由で外部のサービスに問い合わせしないようにしてください。代わりに、サービスタスクを使用して外部サービスとのモデル通信を使用してください。
- スクリプトは例外を送出しないようにしてください。ランタイムの例外はスクリプト内で検出して管理するか、プロセス内で処理できるようにシグナルかエラーに変換する必要があります。
kcontext 変数
この変数は 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 );