3.5. アクティビティ

アクティビティとは、プロセスの実行中に行う必要のあるアクションのことです。各アクティビティには、内向き接続が 1 つと外向き接続が 1 つ含まれています。
各アクティビティにはノードを識別する ID と、ノードの名前を表示する名前があります。追加のプロパティは以下の表に記載しています。

表3.2 アクティビティ

アクティビティの種類 追加のプロパティ 使用法
スクリプトのタスク
この画像はノードに関連付けられたスクリプトタスクを指しています。
  • Action:
    ノードに関連するアクションスクリプト
スクリプトタスクは、このプロセスで実行すべきスクリプトを指しています。関連のアクションは、実行スべきこと、アクションのコーディングに使用する方言 (Java または MVEL)、実際のアクションコードを指定します。このコードは、変数や Global 変数にアクセスできます。また、事前定義されている変数 'kcontext' もあり、これは 'ProcessContext' オブジェクトを参照します (このオブジェクトを使用して現在の ProcessInstance または NodeInstance にアクセスできます。また変数の取得と設定や以下を使って ksession へアクセスできるように、このオブジェクトを使用することができます)。
kcontext.getKnowledgeRuntime())
プロセス内でスクリプトタスクに到達すると、アクションを実行して次のノードに進みます。
ユーザータスク
この図はノードに関連付けられたユーザータスクを指しています。
  • TaskName:
    ヒューマンタスクの名前
  • Priority:
    ヒューマンタスクの優先順位を指定する整数
  • Comment:
    ヒューマンタスクに関連するコメント
  • ActorId:
    ヒューマンタスクの実行を担当するアクター ID。アクター ID の一覧を指定するには、区切り文字としてコンマ (',') を使用してください。
  • GroupId:
    ヒューマンタスクの実行を担当するグループ ID。グループ ID の一覧を指定するには、区切り文字としてコンマ (',') を使用してください。
  • Skippable:
    ヒューマンタスクが任意かどうかを指定します。
  • Content:
    このタスクに関連付けられたデータ
  • Swimlane:
    このヒューマンタスクノードの一部となるスイムレーン
  • On entry および on exit アクション
    このノードが出入の際に実行されるアクションスクリプト
  • Parameter mapping:
    プロセス変数の値をヒューマンタスクのパラメーターにコピーします。ヒューマンタスクが作成されると、この値はコピーされます。
  • Result mapping:
    ヒューマンタスクからの結果パラメーターをプロセス変数にコピーします。結果と呼ばれる変数を持つヒューマンタスクには、ヒューマンアクターにより返されたデータが含まれ、結果変数 ActorId にはこのタスクを完了したアクターの ID が含まれます。
プロセスは、ヒューマンアクターにより実行する必要のあるタスクが関連します。ユーザータスクは、ヒューマンアクターにより完了されるアトミックタスクを指します。ユーザータスクはスイムレーンとあわせて使用して、複数のヒューマンタスクを同様のアクターに割り当てることができます。スイムレーンとヒューマンタスクに関する詳細情報は、ヒューマンタスクの章を参照してください。
サービスタスク
この図はノードに関連付けられたサービスタスクを指しています。
  • Parameter mapping:
    プロセス変数の値を作業アイテムのパラメーターにコピーします。作業アイテムが作成されると、この値はコピーされます。
  • Result mapping:
    アイテムが完了した時点で、作業アイテムからの結果パラメーターをプロセス変数にコピーします。例えば、FileFider の作業アイテムにパラメーターファイルがある場合、検索基準と一致するファイルの一覧を返します。そしてこのファイル一覧は、プロセス内で利用するプロセス変数にバインドできます。
  • On entry および on exit アクション
    このノードが出入の際に実行されるアクション
  • 追加パラメーター
    各種類の作業アイテムは、作業アイテムの種類にあったパラメーターを追加で定義できます。ユーザーは、これらの値を直接渡すか、パラメーターマッピングを定義することができます。両方のメソッドが使用される場合、パラメーターマッピングがユーザーが提示したパラメーターより優先されます。この値は、作業アイテムの作成時に取得され、変数上で toString() を呼び出した結果により、代入式は置き換えられます。この式は (変数の値を解決するために) 変数名となる可能性もありますが、より詳細な MVEL 式を使用することも可能です (#{person.name.firstname})。
サービスタスクは、このプロセスで実行すべき作業の抽象ユニットを指します。プロセスエンジンの外で実行される作業はすべて、サービスタスクを使用して (宣言的な方法で) 表現する必要があります。様々な種類のサービス (例:e-メールの送信、メッセージのロギングなど) が事前定義されていますが、各種ドメイン固有サービスまたは作業アイテムを定義できます。詳細は、ドメイン固有プロセスの章を参照してください。
ビジネスルールタスク
この図は、ノードに関連付けられたビジネスルールタスクのアイコンを指しています。
  • RuleFlowGroup
    この RuleFlowGroup ノードのルールセットを指すルールフローグループの名前です。
ビジネスルールタスクは、評価する必要のあるルールセットのことです。ルールは、Drools ルール形式を使用して別ファイルで定義します。ルールは、ルールのヘッダーで ruleflow-group 属性を使用することで、指定のルールフローグループの一部となります。プロセスでルールタスクに到達すると、エンジンは該当の ruleflow-group の一部であるルールの実行を開始します (あれば)。このルールフローグループにアクティブなルールがなくなると、次のノードに自動的に進み実行されます。つまり、ルールフローグループの実行中は、現在アクティブなルールフローグループに所属する新規アクティベーションをアジェンダに追加することができます。これは、他のルールがファクトに変更を加えるため発生します。ルールフローがすでにアクティブな場合、ルールフローグループはアクティブな状態を保ち、ルールフローグループでアクティブなルールがすべて終わってから、実行は次に継続されます。
組み込みサブプロセス
このアイコンは、ノードコンテナーの機能を果たす組み込みサブプロセスの図です。
  • VariableID
    variable_name からの変数 ID を持つ他の変数とは違い、組み込みサブプロセスは以下の形式の変数 ID を持ちます。
    subprocess_node_id:variable_name
  • Variables
    このノード実行時にデータを保存するために、追加の変数を定義することができます。詳細は 「データ」 を参照してください。
サブプロセスとは、ノードコンテナーの役割を果たせるように他のノードを含めることができるノードです。これは、このサブプロセスノードの中にプロセスの一部を埋め込むだけでなく、このコンテナー内にある全ノードにアクセス可能な追加変数も定義できます。サブプロセスは、開始イベント 1 つと、1 つ以上の終了イベントが必要です。
再利用可能なサブプロセス
このアイコンは、再利用可能なサブプロセスの図で、別のプロセス内でプロセスが開始することを指します。
  • ProcessId:
    実行すべきプロセスの ID
  • Wait for Completion:
    False の場合、このプロセスはサブプロセスが開始するとすぐに継続されます。
    True の場合、サブプロセスが終了 (完了または中断) するまで待機します。
  • Independent:
    True の場合、子プロセスが独立プロセスとして開始され、親プロセスが完了しても、この子プロセスは終了されません。
    Independent は Wait for Completion が true に設定されている場合は False のみ設定可能です。False に設定されている場合、サブプロセスは親プロセスが終了するとキャンセルされます。
  • On entry および on exit アクション
    このノードが出入の際に実行されるアクション
  • Parameter in/out mapping:
    サブプロセスノードは、変数に "in" と "out" マッピングを定義することができます。"in" マッピングに指定された変数は、プロセス開始時に (関連のパラメーターとあわせて) パラメーターとして使用されます。"out" マッピングに定義された子プロセスの変数は、子プロセスが完了すると、このプロセスの変数にコピーされます。"out" マッピングは "wait for completion" が true に設定されている場合のみ利用可能です。
再利用可能なサブプロセスは、プロセス内から別のプロセスを呼び出すという部分を指します。再利用可能なサブプロセスノードにプロセス内で到達すると、エンジンは、指定の ID を持つプロセスを開始します。
マルチインスタンスのサブプロセス
このアイコンはマルチインスタンスのサブプロセスの図ですが、このサブプロセスはプロセス内にあるセグメントを複数回実行することが可能です。
  • CollectionExpression:
    配列形式または java.util.Collection 型の要素の集まり
  • VariableName
    この集まりからの現在の要素を含む変数の名前。これにより、複合ノードが選択した要素にアクセスできるようになります。
インスタンスが複数あるサブプロセスは特殊なサブプロセスで、プロセス内にあるセグメントを複数回実行できます (ただしコレクション内のの要素ごとに 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 );