この章では、Oracle Fusion Middlewareでのトリガー機能の使用方法について説明します。このドキュメントでは、トリガーのインストール場所、呼び出し方法、および使用方法について説明します。
この章の内容は以下のとおりです。
Oracle Fusion Middlewareのトリガーとは、EDQシステムの様々なトリガー・ポイントで呼び出すことができるスクリプト(JavaScriptまたはGroovy)のことです。トリガーには、定義済トリガーとカスタム・トリガーの2つのタイプがあります。
定義済トリガーはEDQインストールに付属しています。ディレクタ・ユーザー・インタフェースに表示され、ジョブ構成で使用されて、ジョブの開始、Webサービスの停止、電子メール通知の送信、およびジョブ内から別のジョブの実行を行うことができます。ディレクタ・ユーザーはトリガー・ポイント(ジョブの開始、ジョブの終了、またはその両方)で実行するようにこれらのトリガーを設定できます。ディレクタのオンライン・ヘルプ・システムで定義済トリガーの詳細を参照できます。
カスタム・トリガーはJavascriptまたはGroovyのスキルのある人により作成され、特定のワークフローの目的を達成するようにEDQの機能を拡張することができます。カスタム・トリガーを使用して次のようなタスクを実行できます。
電子メール・メッセージの送信
JMSメッセージの送信
Webサービスのコール
ファイルの作成
テキスト・メッセージの送信
次の定義済トリガー・ポイントでカスタム・トリガーを実行することができます。
ジョブ・フェーズの実行前
ジョブ・フェーズの実行後
一致決定の作成時
ケース管理での遷移の作成時
ジョブの完了時
これらの各トリガー・ポイントには、特別なAPIによりトリガーに渡される、一意のパスと定義済の引数のセットがあります。詳細は、第6.6項「EDQトリガー・ポイントについて」を参照してください。
カスタム・トリガーについては、このドキュメントの後半で説明します。
EDQでカスタム・トリガーを作成してデプロイするには、JavascriptまたはGroovyの知識が必要です。
カスタム・トリガーはEDQのconfig (構成)ディレクトリのtriggersサブディレクトリに格納される必要があります。新しいまたは更新されたトリガーは自動的にロードされ、システムを再起動する必要はありません。
スクリプトAPIの機能を使用してトリガーを作成できます。これらの機能はトリガー・コードで定義されます。このドキュメントでの例はJavaScriptですが、同じAPIがGroovyでも使用可能です。
次にこのAPIでの各機能について説明します。
トリガーが処理するパスを定義する文字列を返します。各トリガー・ポイントには一意のパスがあります。トリガー・ポイントに到達すると、指定したパスに一致するトリガーが実行されます。トリガー・ポイントの詳細は、第6.6項「EDQトリガー・ポイントについて」を参照してください。
この機能は正規表現です。たとえば、パス/log/com\.datanomic\..*はログ出力名に文字列datanomicが含まれるログ出力パスと一致します(つまり、"datanomic"という語がEDQ用の別名になっている、EDQに定義されたログ出力)。
トリガーを実行します。これらの各変数に対するトリガーAPIによる戻り値の詳細は、第6.6項「EDQトリガー・ポイントについて」を参照してください。
トリガーのパスで、/runtime/engine/interval/endなどです。
トリガーのIDIDはトリガーがディレクタ・ユーザー・インタフェースで構成されるときに設定されます。このIDは単純なトリガーに対してはnullです。
1つ以上のキー/値のペアの形式でのトリガー環境で、env.project = project nameなどです。env入力はトリガー・ポイントに特有です。これらの値はスクリプト内でenvオブジェクトのプロパティとして公開されます。ほとんどのトリガー・ポイントは関連するEDQプロジェクトIDおよびプロジェクト名で渡されます。
追加の引数はトリガー・ポイントに特有です。たとえば、Interval endトリガー・ポイントは、タスク・コンテキスト・オブジェクト、プロセス・オプション、間隔の数(>= 1)、実行統計を返します。
(オプション機能)トリガーをフィルタ処理で除外してから実行できます。このフィルタを使用して、不要なトリガーの実行によるオーバーヘッドを回避します。トリガーを有効にするにはtrueを返し、無効にするにはfalseを返します。
トリガーのパス。
1つ以上のキー/値のペアの形式でのトリガー環境です。env入力はトリガー・ポイントに特有です。これらの値はスクリプト内でenvオブジェクトのプロパティとして公開されます。ほとんどのトリガー・ポイントは関連するEDQプロジェクトIDおよびプロジェクト名で渡されます。次の例では、トリガーは関連プロジェクトの名前が"My project"であるときのみ有効になります。
function filter(path, env) {
return env.project == 'My project';
}
(オプション機能)トリガーが受け入れる最大レベルを返します。たとえば、次の文では、トリガーはトリガー・システムでの他の設定にかかわらず、すべてのレベルを受け入れることができます。レベルの設定の詳細は、第6.8項「トリガー・レベルの設定」を参照してください。
function getLevel() {
return Level.SEVERE;
}
(オプション機能)ディレクタ・ユーザー・インタフェースでの表示用のTriggerNameオブジェクトの配列を返します。詳細は、第6.10項「ジョブ構成のトリガーの公開」を参照してください。トリガー名の取得とディレクタ・インタフェースでの公開は、ジョブ構成画面でのみ可能です。
[これは画面の実際の名前ですか。またはフェーズ構成とする必要がありますか。]
プロパティ・ファイルでスクリプト・トリガー用の追加の構成を指定できます。すべてのトリガーで使用可能なconfigという名前の定義済オブジェクトにより、これらのプロパティへのアクセスが行われます。これらのプロパティ・ファイルのEDQのベース・ディレクトリは、triggersディレクトリ内のサブディレクトリconfigです。次にconfigオブジェクトの便利なメソッドを示します。
名前がtriggers/configディレクトリ内の指定したディレクトリで検索パターンに一致するファイル・オブジェクトの配列を返します。
triggers/configディレクトリ内のディレクトリの名前。
一致させる検索パターンを定義する正規表現(regex)。
指定したJavaプロパティ・ファイルをロードし、JavaScriptオブジェクトとして返します。
Javaプロパティ・ファイルの名前。
この項では、カスタム・トリガーをコールできるEDQ内でのトリガー・ポイントについて説明します。
ログ・メッセージがシステムで生成されるたびにコールされます。
| コンポーネント | 説明 |
|---|---|
|
|
|
|
|
|
|
|
|
高レベルsyslogログ・メッセージが生成されるたびにコールされます。source引数はイベント・ソースの詳細を含むJavaオブジェクトです。これは表示用の文字列に変換できます。
| コンポーネント | 説明 |
|---|---|
|
|
|
|
|
|
|
|
|
プロセスの開始時にコールされます。この引数はプロセス構成の情報を含むJavaオブジェクトです。
| コンポーネント | 説明 |
|---|---|
|
|
/ |
|
|
|
|
|
|
プロセスの終了時にコールされます。この引数はプロセス構成の情報を含むJavaオブジェクトです。
| コンポーネント | 説明 |
|---|---|
|
|
|
|
|
|
|
|
|
通常のプロセスの終了時または間隔モードで実行するプロセスの各間隔の終了時にコールされます。実行済レコードの数などの統計を返します。
| コンポーネント | 説明 |
|---|---|
|
|
|
|
|
|
|
|
|
'フェーズ前'に対するジョブ構成の実行でコールされます。
| コンポーネント | 説明 |
|---|---|
|
|
|
|
|
|
|
|
なし |
'フェーズ後'に対するジョブ構成の実行でコールされます。
| コンポーネント | 説明 |
|---|---|
|
|
|
|
|
|
|
|
なし |
EDQが可能性のある一致について決定する必要のあるときにコールされます。これは関係決定トリガーと呼ばれています。関係決定トリガーは、一致を実行するために必要な、関係および決定データを返すメソッドを含むことができます。このトリガー・ポイントは一致レビューに特有です。
| コンポーネント | 説明 |
|---|---|
|
|
|
|
|
|
|
|
|
この項では、TriggerInfoトリガー・ポイントに関連する各メソッドについて説明します。これらのメソッドは、一致レビューで使用されるTriggerInfoトリガー・ポイントに特有です。
表6-1 TriggerInfoトリガー・ポイントに関連するメソッド
| メソッド | 返されるデータ | 説明 |
|---|---|---|
|
|
文字列 |
決定の前に照合ステータスを返します。 |
|
|
文字列 |
決定の前に関係レビュー・ステータスを返します。 |
|
|
整数 |
関係IDを返します。 |
|
|
整数 |
最初のレコードのIDを返します。 |
|
|
整数 |
最初の入力のIDを返します。 |
|
|
整数 |
2番目のレコードのIDを返します。 |
|
|
整数 |
2番目の入力のIDを返します。 |
|
|
文字列 |
新しい関係のレビュー・ステータスを返します。 |
|
|
文字列 |
新しい照合ステータスを返します。 |
|
|
文字列 |
関係を生成したルールの名前を返します。 |
|
|
文字列 |
コメントを作成したユーザーのユーザー名を返します。 |
|
|
文字列 |
作成されたコメントを返します。 |
|
|
日付 |
コメントが作成された日時を返します(コメントが存在する場合)。 |
|
|
文字列 |
レビューを実行したユーザーの名前を返します。 |
|
|
日付 |
レビューが実行された日時を返します。 |
|
|
リスト |
最初のレコードを構成するすべてのソース属性(列)を返します。 |
|
|
リスト |
2番目のレコードを構成するすべてのソース属性(列)を返します。 |
|
|
値 |
最初のレコードの指定されたソース属性(列)の値を返します。 |
|
|
値 |
2番目のレコードの指定されたソース属性(列)の値を返します。 |
すべてのトリガー・ポイントには関連するレベル(java.util.logging.Level値)があります。デフォルトでは、INFOよりも低いレベルのトリガー・コールは無視されます。
このレベルを変更する1つの方法は、levels.propertiesという名前のファイルをconfigディレクトリのtriggersサブディレクトリに作成することです。このファイルには、デフォルトのレベルと、個別のパス用の1つ以上のオーバーライド・レベルの両方を含めることができます。例6-1では、デフォルトのレベルをFINEに設定し、パス/runtime/engine/.*用のレベルをFINERに設定しています。パターンとレベル・プロパティに対し独自の接頭辞を定義できます。
レベルを変更するもう1つの方法は、トリガーにgetLevel関数を定義することです。詳細は、第6.4項を参照してください。
トリガー・ファイル内でJava Message Service (JMS)を有効にするには、次の手順に従います。
内部JavaScript JMSライブラリをロードします。
addLibrary("jms");
JMS構成を定義するプロパティをロードします。これらのプロパティは、EDQ構成ディレクトリに含まれている標準realtime.propertiesファイルからのJMS設定で拡張されます。このファイルのデフォルト・バージョンは、EDQにバンドルされているオープンソースのActiveMQ Message Brokerのプロパティを定義します。最小限、トリガーは、使用するJMSトピックまたはキューに名前を付ける、destinationプロパティの値を提供する必要があります。
JMSオブジェクトを作成します。
var jms = JMS.open(props);
テキスト・メッセージを送信します。
jms.send(str)
スクリプト・オブジェクトから作成されたJMSマップ・メッセージを送信します。
jms.sendMap(jsobj)
テキスト・メッセージを作成します。送信前にプロパティおよびヘッダー値をメッセージに設定することができます。
var msg = jms.createTextMessage(str)
マップ・メッセージを作成します。送信前にプロパティおよびヘッダー値をメッセージに設定することができます。
var msg = jms.createMapMessage(jsobj)
先行する2つのメソッドのいずれかにより作成されたメッセージを送信します。
jms.sendMessage(msg)
トリガーはディレクタのジョブ・フェーズの構成中に、ジョブでの使用のために選択されます。これはジョブ・フェーズの前または後に実行するように設定することができます。構成画面でトリガーを選択できるようにするには、各トリガーが名前のリストを返すことができる必要があります。これにより必要に応じて1つのトリガーが複数のタスクを実行できるようになります。
トリガー名には次のコンポーネントがあります。
トリガーのrun機能に渡される、内部ID。この機能の詳細は、第6.4項を参照してください。
表示可能なラベル
グループ名
同じグループのトリガー名は、ジョブ構成画面で1つのノードとして表示されます。
新しいトリガー名を作成するには、次のようにします。
var n1 = new TriggerName(id, label) n1.group = "My group";
トリガーからトリガー名を返すには、次のようにします。
トリガー名を返すには、次の例に示すように、getTriggerNames関数を使用します。
function getTriggerNames(path, env) {
var n1 = new TriggerName(id1, label1);
var n2 = new TriggerName(id2, label2);
...
n1.group = "My group";
n2.group = "My group";
...
return [n1, n2 ...]
}
getTriggerNamesの詳細は、第6.4項を参照してください。
次に、カスタム・トリガーを使用する方法の例を示します。
|
注意: このドキュメントでの例はJavaScriptですが、同じAPIがGroovyでも使用可能です。 |
この例では、ロギング・ライブラリが、メッセージのフォーマット指定および出力に使用できるロギング・オブジェクトをインポートします。JMSプロパティ・ファイルはEDQ構成ディレクトリのtriggers/config/jms/jms.propertiesからロードされます。
// Test trigger for task running with JMS
addLibrary("logging");
addLibrary("jms");
function getPath() {
return "/log/com\.datanomic\..*";
}
function run(path, id, env, logrecord) {
var pfiles = config.getTriggerConfigFiles("jms",
"jms\\.properties");
if (pfiles.length > 0) {
var props = config.loadProps(pfiles[0]);
var jms = JMS.open(props);
var msg = logging.format(logrecord);
var len = msg.length;
// Remove trailing newlines
while (len > 0) {
var c = msg.charAt(len - 1);
if (c != '\n' && c != '\r') {
break;
}
len--;
}
jms.send(msg.substring(0, len));
jms.close();
}
}
この例では、最初の行(#! id : syslog)の特別なidディレクティブがトリガーの内部IDを定義します。同じIDで複数のトリガー定義がある場合、後のものが前のものを置き換えます。標準のEDQインストールでは、標準のロギングAPI経由でメッセージをログに記録する定義済syslogトリガーがあります。この例でのidディレクティブの追加により、JMS syslogトリガーが定義済トリガーを置き換えます。
#! id : syslog
// Test trigger for task running with JMS
addLibrary("logging");
addLibrary("jms");
function getPath() {
return "/syslog";
}
function getLevel() {
return Level.SEVERE;
}
function run(path, id, env, level, event, source, message) {
var pfiles = config.getTriggerConfigFiles("jms",
"jms\\.properties");
var props = null;
if (pfiles.length == 0) {
logger.log(Level.WARNING, "syslogger called but no properties");
} else {
props = config.loadProps(pfiles[0]);
var jms = JMS.open(props);
var xml = <syslog level={level}><source>{source}</source><message>{message}</message></syslog>
logger.log(Level.INFO, "xml = {0}", xml.toXMLString());
jms.send(xml.toXMLString());
jms.close();
}
}
この例では、1組のトリガー名が定義され、ジョブ構成画面に表示されます。この例ではトリガーがログ・メッセージを書き込みますが、JMS通知を送信するように構成することもできます。
// Test trigger for misssion phase notification
addLibrary("logging");
function getPath() {
return "/missions/phase/.*";
}
function run(path, id, env) {
logger.log(Level.INFO, "phase called with path {0} and id {1}", path, id);
}
function getTriggerNames(path, env) {
var n1 = new TriggerName("logme", "logme2");
n1.group = "logmegroup";
var n2 = new TriggerName("n2", "n2");
n2.group = "logmegroup";
return [n1, n2];
}