15 Oracle BAMエンタープライズ・メッセージ・ソースの作成
この章では、Oracle Business Activity Monitoring (Oracle BAM)でエンタープライズ・メッセージ・ソース(EMS)を作成して使用する方法について説明します。ここでは、EMS XMLフォーマット構成パラメータの使用方法、日時パターンやロケール情報の指定方法、EMSペイロードのエラー処理方法、リモート・プロバイダでホストされているJava Message Service (JMS)リソースの使用方法について説明します。
この章の内容は次のとおりです。
15.1 エンタープライズ・メッセージ・ソースの理解
エンタープライズ・メッセージ・ソース(EMS)は、Java Message Service (JMS)をOracle BAMサーバーに直接接続します。JMSは、アプリケーション・コンポーネント間でデータを受け渡し、異種およびレガシー環境間でのビジネス統合を可能にするための標準メッセージングAPIです。
EMSはExtract Transform and Load (ETL)シナリオを構成しませんが、メッセージからOracle BAMサーバーのデータ・オブジェクトに直接マップします。ただし、XML Stylesheet Language (XSL)を使用して両者の変換を実行することはできます。各EMSは特定のJMSトピックまたはキューに接続され、その情報はOracle BAMのデータ・オブジェクトに配信されます。Oracle BAMコンポーザの「管理者」ページを使用して、EMS定義を構成します。
デフォルトのJMSプロバイダは、Oracle WebLogic Serverのメッセージングです。Oracle Advanced Queuing (AQ) JMSがサポートされています。Tibco JMS (Oracle以外のプロバイダ)もサポートされています。
詳細は、「外部JMSプロバイダの使用」を参照してください。
次のメッセージ・タイプがサポートされています。
-
マップ・メッセージ
-
XMLペイロードを使用したテキスト・メッセージ
次のXMLフォーマット・オプションがテキスト・メッセージ・トランスフォーメーションでサポートされています。
-
事前処理
-
メッセージ仕様
-
列値(列値はXMLペイロードの要素または属性として提供できます)。
15.2 エンタープライズ・メッセージ・ソースの作成
各EMSは特定のJMSトピックまたはキューに接続され、その情報はOracle BAMのデータ・オブジェクトに配信されます。Oracle BAMコンポーザの「管理者」ページを使用して、EMS定義を構成します。
この項には次のトピックが含まれます:
15.2.1 エンタープライズ・メッセージ・ソースの作成準備
EMSを定義する前に、次のことを検討してください。
-
サード・パーティのJMSアプリケーションを使用している場合は、JMSアダプタを構成してメッセージ・ソース接続の詳細を指定する必要があります。Oracle BAMでは、JMSアダプタを使用して接続します。詳細は、「外部JMSプロバイダの使用」を参照してください。
-
Oracle WebLogic Server以外のJMSサーバー(Tibcoなど)を使用する場合は、作成するどのエンタープライズ・メッセージ・ソースでも永続サブスクリプション名を繰り返さないでください。一部のJMSサーバーでは、クライアントが1つのトピック宛先に複数のConnectionFactoryを持つことはできないため、Oracle BAMが同じトピックに対して同じConnectionFactoryを再利用することはサポートされていません。
-
(キューおよびトピックをホストしている) JMSサーバーは、Oracle BAMサーバーをホストしているシステムとは別のシステムで構成可能です(Oracle Advanced Queuing (AQ)の場合は、データベースでJMSサーバーをホストするためOracle BAMと同じサーバーでホストできますが、他の場合は別のシステムでJMSサーバーをホストすることをお薦めします)。
-
同じトピックまたはキューに2つのエンタープライズ・メッセージ・ソースを構成しないでください。同じキューで2つのエンタープライズ・メッセージ・ソースを要求した場合には、各EMSに別々の「メッセージ・セレクタ」値を指定する必要があります。そうしないと、両方のエンタープライズ・メッセージ・ソースでメッセージが重複するためです。
-
いつでも、1つのEMSで複数のデータ・オブジェクトを更新しないようにすることをお薦めします。それにより、同じデータ・オブジェクトに複数の手段で書き込んだ結果として発生する不一致を回避するとともに、イベントの順序を保持できます。
ソース・イベントが複数のソースから公開されている場合であっても、それらはすべて、そのデータ・オブジェクト用の同じメッセージ・セレクタ(必要な場合)で同じJMSトピックまたはキューに書き込むことができます。
-
EMSを定義する場合は、受信するメッセージ内のすべてのフィールドを指定します。可変数のユーザー定義フィールドを持つメッセージ・システムもあれば、固定数のフィールドを持つシステムもあります。
任意の文字列タイプ・フィールドに対して、そのフィールドにフォーマットを適用し、フィールドの内容を分離された個別のフィールドに分けることができます。これは、ユーザー定義のフィールドを作成できないため、メッセージ本文全体が1つの大きなフィールドとして受信されるメッセージ・システムで役立ちます。フォーマット仕様を使用すると、XMLツリー内の場所のパスを指定した後、属性またはタグをフィールドとして抽出できます。
-
大きいXMLドキュメントの場合には、パフォーマンスに対する通常のXSLT処理の影響が適用されます。このため、可能な場合は、BAMの消費に対してバインドされているJMSキューに移入する前に、ソースでデータ変換を行うことをお薦めします。
-
EMSの分散JMSキューを単一のトランザクションとしてデータ・オブジェクトに書き込むには、キューに関連するアウトバウンド接続JNDIの接続ファクトリ値がXAに対応している必要があります(
weblogic.jms.XAConnectionFactory
)。これにより、JMSセッションがJTAトランザクションに自動的に登録されます。BAMではXAデータ・ソースがすでに使用されているため、XAトランザクションでJMSおよび永続性APIがシームレスに参加します。JMSメッセージは、配信後にデキューされます。トランザクションがコミットされた場合、データベースの変更がコミットされ、JMSメッセージはキューから削除されます。ロールバックが発生すると、メッセージは再試行するためにキューに戻されます。
15.2.3 日時仕様の構成
日時パターンを入力して、ロケール情報を指定できます。
EMSペイロードにタイムスタンプ・フィールドを含める場合は、次のことを考慮してください。
-
タイムスタンプ・フィールドにnullを挿入すると、EMSのようなクライアントで管理されなくなる可能性があります。
-
(Oracle BAMのように)タイムスタンプ・フィールドに値を指定しない場合、EMSは現在の日時を割り当てます。
-
受信タイムスタンプ値が
xsd:dateTime
またはEMSで指定された日時書式に従っていない場合は、現在の日時が挿入されます。
日時仕様の使用が無効な(選択されていない)場合、入力値の書式はxsd:dateFormat
である必要があります。つまり、「日時仕様」が構成されていない場合は、xsd:dateFormat
([-]CCYY-MM-DDThh:mm:ss[Z|(+|-)hh:mm])がデフォルト書式です。
次に、xsd:dateTime
の有効な値パターンの例を示します。
-
2001-10-26T21:32:52
-
2001-10-26T21:32:52+02:00
-
2001-10-26T19:32:52Z
-
2001-10-26T19:32:52+00:00
-
-2001-10-26T21:32:52
-
2001-10-26T21:32:52.12679
日時仕様を構成するには:
表15-1 SimpleDateFormatの構文要素
記号 | 意味 | プレゼンテーション | 例 |
---|---|---|---|
G |
Era |
テキスト |
AD |
y |
Year |
数値 |
2003 |
M |
Month |
テキストまたは数値 |
July、Jul、07 |
w |
年内の週数(1から53) |
数値 |
27 |
W |
月内の週数(1から5) |
数値 |
2 |
D |
年内の日数(1から365または1から364) |
数値 |
189 |
d |
月内の日数 |
数値 |
10 |
F |
月内の週数(1から5) |
数値 |
2 |
E |
曜日 |
テキスト |
Tuesday、Tue |
a |
午前/午後マーカー |
テキスト |
AM |
H |
時間(0から23) |
数値 |
0 |
k |
時間(1から24) |
数値 |
24 |
K |
時間(0から11、AM/PM) |
数値 |
0 |
h |
時間(1から12、AM/PM) |
数値 |
12 |
m |
時間内の分数 |
数値 |
30 |
s |
分内の秒数 |
数値 |
55 |
[S] |
ミリ秒(0から999) |
数値 |
978 |
z |
タイムゾーン |
一般的なタイムゾーン |
太平洋標準時、PST、GMT-08:00 |
Z |
タイムゾーン |
RFC 822タイムゾーン |
-0800 |
' |
テキストのエスケープ |
デリミタ |
MMM ''01 -> Jul '01 |
表15-2の例は、日時パターンが米国のロケールでどのように解釈されるかを示しています。すべての例で使用されている日時は、アメリカ太平洋標準時タイムゾーンの2001-07-04 12:08:56
ローカル時間です。
表15-2 日時パターンの例
日時パターン | 結果 |
---|---|
"yyyy.MM.dd G 'at' HH:mm:ss z" |
2001.07.04 AD at 12:08:56 PDT |
"EEE, MMM d, '' yy" |
Wed, Jul 4, '01 |
"h:mm a" |
12:08 PM |
"hh 'o''clock' a, zzzz" |
12 o'clock PM, 太平洋夏時間 |
"K:mm a, z" |
0:08 PM, PDT |
"yyyyy.MMMMM.dd GGG hh:mm aaa" |
02001.July.04 AD 12:08 PM |
"EEE, d MMM yyyy HH:mm:ss Z" |
Wed, 4 Jul 2001 12:08:56 -0700 |
"yyMMddHHmmssZ" |
010704120856-0700 |
"yyyy-MM-dd'T'HH:mm:ss.SSSZ" |
2001-07-04T12:08:56.235-0700 |
15.2.3.1 Oracle AQ JMS日時の考慮事項
Oracle AQ JMSを介して日時データをOracle BAM EMSに送信する場合は、日時仕様を構成するときに次のことを考慮する必要があります。
Oracleデータベース内のデフォルトの日時書式は、NLSセッション・パラメータNLS_DATE_FORMAT
、NLS_TIMESTAMP_FORMAT
およびNLS_TIMESTAMP_TZ_FORMAT
を使用して明示的に、またはNLSセッション・パラメータNLS_TERRITORY
を使用して暗黙的に指定されます。
トリガー処理コード(PL/SQL)が明示的な書式で日付書式をオーバーライドしない場合、日付はデータベース・セッションのNLSパラメータで指定された書式に従って書式設定され、それに応じてEMSに送信されます。つまり、受信データを解析および解釈するために、EMS日時仕様はNLSパラメータに相当する書式を必要とします。
ただし、データベース管理者がNLSパラメータを変更した場合、EMS側で問題が発生します。デフォルトのNLSパラメータで指定された書式に依存するのではなく、to_char()
関数を使用して明示的な書式設定を使用するのが常に安全な方法です。
トリガー処理コードの次の例のような行を
'<HIREDATE>' || :new.HIREDATE || '</HIREDATE>' ||
次のように変更する必要があります。
'<HIREDATE>' || to_char(:new.HIREDATE, 'MM/dd/yy HH24:MI:SS') || '</HIREDATE>' ||
EMS日時仕様ドロップダウン・リストから選択された、対応する書式はMM/dd/yy H:mm:ss
です。
同様に、タイムスタンプ・データの場合、to_char()
関数を使用してデータベース側で選択された書式はMM/dd/yy HH24:MI:SS.FF
です。対応するEMS日時仕様の書式はMM/dd/yy H:mm:ss:SSS
です。
15.2.4 拡張XMLフォーマットの使用
拡張フォーマット・オプションを使用すると、EMSでは、メッセージ内のフォーマットされた各フィールドにユーザーが指定したXSLトランスフォーメーション(XSLT)を含めることができます。
XSLTは、次の目的で使用されます。
-
階層データの処理。データ・フローでは、階層データは処理されません。XSLTでは、受信したXMLを、繰返しフィールドが含まれた単一のレコードにフラット化できます。
-
単一のキュー内に複数のタイプのメッセージが含まれているメッセージ・キューの処理。データ・フローでは、Message Receiverからのすべてのレコードは同じスキーマのものである必要があります。EMS出力は、受信するメッセージ・スキーマの結合スーパーセットとして定義できます。また、XSLトランスフォーメーションによって、各メッセージ・タイプを識別して、必要に応じてこのスーパーセット・スキーマにマップできます。
-
データは階層では表されていないが、必要なデータが複数のレベルで含まれているXMLの処理。EMSフォーマットでは、XMLの1つのレベルのみから読取りを行うことができます。XSLトランスフォーメーションによって、入力XML内の様々なレベルで必要なデータを識別し、すべてのデータが1つのレベルで結合される新しいXMLにすべてを出力できます。
XSLトランスフォーメーションを指定するには:
15.2.5 EMSエラー処理の構成
「エラー処理」設定を構成して、EMSペイロード・エラーの処理方法を指定します。EMSペイロードにおけるエラーの処理方法は、ログ・ファイルにエラー・メッセージを書き込むか、エラー・メッセージをデータ・オブジェクトに挿入するか、またはJMSトピックやJMSキューにエラー・メッセージをパブリッシュするという方法で構成できます。
エラー処理は、ロールバックの発生した後およびすべてのJMSメッセージの再試行が失敗した後に発生します。
フォルト処理を構成するには:
表15-3 「フォルト・メッセージを書込み」オプションのパラメータ
オプション | パラメータ | 説明 |
---|---|---|
データ・オブジェクトへ |
エラー・データ・オブジェクト |
エラー・メッセージを書き込むデータ・オブジェクト名。 |
データ・オブジェクトへ |
データ・オブジェクト・フィールド |
エラー・メッセージを書き込むデータ・オブジェクト内のフィールド。最長のエラー・ペイロードに対応できる十分な長さの文字列フィールドを選択してください。 |
JMSキュー/トピックへ |
初期コンテキスト・ファクトリ |
特定のJMSコネクション・ファクトリまたは宛先の検索に使用される、初期コンテキスト・ファクトリ。たとえば: weblogic.jndi.WLInitialContextFactory |
JMSキュー/トピックへ |
JNDIサービス・プロバイダURL |
使用するサービス・プロバイダの構成情報。javax.naming.Context.PROVIDER_URLプロパティを設定するために使用され、initialContext()に対する引数として渡されます。不適切なプロバイダのURLが最も一般的なエラーの原因です。たとえば: t3://localhost:7001 |
JMSキュー/トピックへ |
トピック/キュー接続ファクトリ |
以前に作成されたJMSコネクション・ファクトリのJNDIルックアップで使用される名前。たとえば: jms/QueueConnectionFactory |
JMSキュー/トピックへ |
トピック/キュー名 |
エラー・メッセージをポストする場合に使用するトピック/キュー。たとえば: jms/demoQueue jms/demoTopic |
JMSキュー/トピックへ |
JNDIユーザー名 |
JNDIサービス呼出し元を認証する本人の本人証明。このユーザーにはRMIログイン許可が必要です。 |
JMSキュー/トピックへ |
JNDIパスワード |
JNDIサービス呼出し元を認証する本人の本人証明。 |
JMSキュー/トピックへ |
JMSユーザー名(オプション) JMSパスワード(オプション) |
コネクション・ファクトリで新しいJMSコネクションが作成されたときに、この情報をオプションとして提供できます。アプリケーション管理またはコンテナ管理された認証用JMSプロバイダへの接続を認証するために使用します。 |
次の例は、パブリッシュされたメッセージのフォーマットを示しています。
EMS <<EMS Name>> failed to process the payload: <<payload>> with the following exception: <<Exception details>>.
たとえば:
EMS MyInsertEMS, failed to process the payload: <testems><test>abcd</test1> with the following exception: The end-tag for element type "test" must end with a '>' delimiter.
JMSトピックまたはJMSキューにエラー・メッセージをパブリッシュする場合のフォルト処理を設計するときは、注意してください。次に、このトピックまたはキューが別の(または同じ)EMSに対して構成される場合、このEMSに同じメッセージが再度使用され、これにより、再帰的な失敗が発生します。Oracle BAMでは、CDATAを使用してメッセージをエンコードすることによってメッセージを処理しますが、再帰的な失敗が発生する可能性のあるSQL例外などの、他の問題が発生する場合があります。
15.3 エンタープライズ・メッセージ・ソースの使用
EMS属性は、組織のニーズに合わせて変更できます。
この項には次のトピックが含まれます:
15.3.2 エンタープライズ・メッセージ・ソースの開始と停止
EMSを開くには、「エンタープライズ・メッセージ・ソースの編集」を参照してください。
EMS定義タブの「開始」および「停止」ボタンを使用して、EMSを開始および停止します。停止済ステータスでは、コンシューマは非アクティブです。
EMSを開始するとサブスクライブされ、EMSを停止するとサブスクライブ解除されます。
デフォルトで、EMSはOracle BAMサーバーの起動時に開始されます。
「編集」をクリックして、「自動起動」の設定を変更します。
ノート:
EMSの「自動起動」のデフォルト値は「いいえ」です。次のように、bamcommandを使用してEMSを開始および停止することもできます。
bamcommand -cmd start -name <ems_name> -type ems
bamcommand -cmd stop -name <ems_name> -type ems
15.3.3 エンタープライズ・メッセージ・ソース・メトリックの監視
EMSを開くには、「エンタープライズ・メッセージ・ソースの編集」を参照してください。
EMS定義タブにある「メトリック」ボタンを使用して、選択したEMS統計を監視します。「メトリック」ダイアログに、「サーバー名」、「送信メッセージ」、「持続したメッセージ」および「失われたメッセージ」カウンタが表示されます。これらの値は、最後の開始時またはリセット時から累積されます。
「サーバー名」は、EMSが現在実行中のサーバーの名前を示します。これにより、クラスタ環境でEMSが実行中のノードの識別が容易になります。
「失われたメッセージ」は「送信メッセージ」から「持続したメッセージ」を引いて計算されます。
これらの最新のカウンタ値を表示するには、「リフレッシュ」をクリックします。
カウンタ値を0(ゼロ)に設定するには、「リセット」をクリックします。
ノート:
スループット向上のために「メトリック」のデータを使用しない場合は、サーバーの起動時にJVMの引数を-Dems.metrics.required=false
に設定できます。フラグを指定すると、「メトリック」にメッセージ件数は表示されなくなります。状態が保持されないため、パフォーマンスの向上を見込めます。
15.3.5 エンタープライズ・メッセージ・ソースの保護
EMSのセキュリティ設定を変更するには:
-
「管理者」ページに移動します。
-
左側のナビゲーション・ペインで、「エンタープライズ・メッセージ・ソース」の左側の矢印をクリックします。
現在のプロジェクトのすべてのEMSがリストに表示されます。
-
EMSを右クリックし、ポップアップ・メニューから「セキュリティ」を選択します。
EMSのセキュリティ・タブが開きます。
-
明示的に権限を付与または拒否するロールまたはグループを追加するには、次のステップを実行します。
-
「権限の付与」表または「権限の拒否」表で「追加」アイコンをクリックします。
「アプリケーション・ロール、グループおよびユーザーの追加」ダイアログが開きます。
ユーザーをロールおよびグループに追加する方法の詳細は、「Oracle BAMユーザーの管理」を参照してください。
-
追加するロールまたはグループの名前を「名前」に入力します。
-
ドロップダウン・リストから「アプリケーション・ロール」または「グループ」を選択します。
-
「検索」をクリックして、「選択可能メンバー」リストにデータを移入します。
-
「選択済メンバー」リストにメンバーを追加するには、メンバーを選択し、一重の右矢印をクリックします。
-
「選択済メンバー」リストにすべてのメンバーを追加するには、メンバーを選択し、二重の右矢印をクリックします。
-
「選択済メンバー」リストからメンバーを削除するには、一重および二重の左矢印を使用します。
-
「選択済メンバー」リストが完成したら、「OK」をクリックします。
「アプリケーション・ロール、グループおよびユーザーの追加」ダイアログが閉じ、「名前」に指定した名前が表に表示されます。
-
-
ロールまたはグループを削除するには、表の行を選択し、「削除」アイコンをクリックします。
-
権限を付与するには、「権限の付与」表にリストされているユーザー、ロールおよびグループに対し、「読取り」、「書込み」、「削除」または「セキュリティ」を選択します。
-
権限を拒否するには、「権限の拒否」表にリストされているユーザー、ロールおよびグループに対し、「読取り」、「書込み」、「削除」または「セキュリティ」を選択します。
-
「保存」をクリックします。
15.5 Oracle BAMアダプタのデプロイメントの更新
新しいJNDIを使用してSOAコンポジットをデプロイする際、コンポジットをデプロイする前に、その名前をJCAファイルで指定し、Weblogic Server (WLS)上で参照できるようにして、BAMアダプタのプロパティが更新されるようにする必要があります。
- 管理コンソールにログインします。
- 「ロックして編集」ボタンをクリックします。
- 「デプロイメント」で、bamjcaadapterの横にあるボックスを選択します。
- 「更新」をクリックし、次の画面に表示される「このアプリケーションを次のデプロイメント・ファイルを使用して再デプロイします。」ボタンを選択します。
- 「終了」をクリックします。
15.6 外部JMSプロバイダの使用
Oracle WebLogic Serverでは、Oracle WebLogic Server以外の(外部) JMSプロバイダと、Oracle WebLogic Serverにデプロイされているアプリケーションを統合できます。このようなアプリケーションの1つがOracle BAMです。
外部JMSプロバイダには、独自のJMSクライアントおよびJava Naming and Directory Interface (JNDI)クライアントAPIが設定されています。これらの依存性を識別し、リモート・プロバイダでホストされているJMSリソースをOracle WebLogic Serverにデプロイされているアプリケーションによって参照できるようOracle WebLogic ServerでこれらのAPIを使用できるようにするには、いくつかの構成を行う必要があります。
詳細は、『テクノロジ・アダプタの理解』のJMSのOracle JCAアダプタに関する項、および『Oracle WebLogic Server JMSリソースの管理』のサード・パーティJMSプロバイダにアクセスするための外部サーバー・リソースの構成に関する項を参照してください。
高レベルの構成ステップは、次のとおりです。
15.7 EMSのJCAアラート・メカニズムの構成
Oracle BAM EMSインスタンスによって、バックグラウンド・スレッドでJCAサービスが開始されます。JCAでリモート・キュー・エラーなどの例外が発生した場合、JCAサービスにより、BAM EMSにアラート例外が送信されます。
これに対処するために、Oracle BAMにはEMSHistoryデータ・オブジェクトが付属しています。これは、サーバーの起動時に自動的に作成されます。JCA サービス例外は、このデータ・オブジェクトによって取得され、これによりEMSインスタンスの実行が維持されます。EMSインスタンスを停止する場合は、それに応じて構成できます。
- Oracle BAM Composerで、新規プロジェクトを作成するか、既存のプロジェクトを選択します。プロジェクトの作成の詳細は、「プロジェクトの作成」を参照してください。
- EmsHistoryデータ・オブジェクトをプロジェクトに追加します。
- アラートを作成します。詳細は、「アラートの作成」を参照してください。
- 「データ・オブジェクトのデータ・フィールドが特定の条件を満たす場合」イベント・トリガーを選択します。
- <このデータ・フィールドの条件 x>条件をクリックし、EmsHistoryデータ・オブジェクトを選択します。
- 条件「EMS NAME」と「はnullではない」を指定して行フィルタを追加し、「OK」をクリックします。
- <ユーザーの選択>をクリックし、適切なユーザー・ロールを割り当てます。
- <アクションの追加>リンクをクリックし、「電子メールでメッセージを送信」を選択して、「メッセージ・エディタ」のすべての必須フィールドに入力します。
- 「OK」をクリックします。