Oracle Application Serverリリース10.1.3.4は、ESB内でリシーケンサを実装するためのサポートを導入しています。ここでは、次の項目について説明します。
リシーケンサを使用して、関連しているが順序が不正なメッセージ・ストリームを順序どおりに並べ替えます。メッセージは、その一部である識別子に従って並べ替えられます。リシーケンサは、メッセージの並べ替えのため識別子の順序を認識する必要があります。メッセージの並べ替え時、リシーケンサは通常、識別子の順序でメッセージの位置を決定します。この項の内容は次のとおりです。
注意: リシーケンサは preview モードで有効で、デフォルトでは無効です。無効な場合は、既存の製品機能に影響しません。リシーケンサを使用する場合は、ESB構成パラメータEnableResequencer の値をtrue に設定して有効にする必要があります。詳細は、「開発」を参照してください。 |
ESBは、着信メッセージをユーザー指定の順序で並べ替えできます。この実装により、次の3タイプの順序を指定できます。
先入れ先出し(FIFO)
FIFO Oracle ESB Resequencerは、FIFOパターンをサポートします。この方式は、リシーケンサとして構成されるESBルーティング・サービスにメッセージの到着時刻に基づく順序付けが必要なアプリケーションに関連しています。FIFOリシーケンサは、正しい順序のメッセージ・ストリームを受信し、外部データ・ストアを使用してメッセージが非同期に処理されるまで正しい順序で格納します。
メッセージは、ルーティング・サービスへの到着時刻に基づく順序で処理されます。FIFOリシーケンサ・ルーティング・サービスのアウトバウンド・サービスへのメッセージは、確実に到着時刻に基づいた順序で到着するので注意する必要があります。FIFOリシーケンサはメッセージの内容を変更せず、FIFO順に従って送信します。
注意: ESB FIFOリシーケンサは、ESBルーティング・サービスのメッセージ受信と同じ順序でメッセージを送信します。ただし、ESBがデータベース・アダプタまたはファイル・アダプタからの入力を受信するフローでは、これらのアダプタ自体はFIFO方式でメッセージを処理しないため、その処理がFIFO方式ではない可能性があります。ファイル・アダプタおよびデータベース・アダプタにFIFO方式でメッセージを処理させるために適用する必要のある回避策に関しては、「FIFO用のデータベース・アダプタおよびファイル・アダプタの構成」を参照してください。 |
標準リシーケンサ
標準のOracle ESB Resequencerは、標準リシーケンサ・パターンをサポートします。この方式は、メッセージの簡易数値識別子順序から識別子を使用するアプリケーションに関連しています。標準リシーケンサは、不正な順序で到着する可能性のあるメッセージ・ストリームを受信します。これは、内部データ・ストアを使用して、SequenceId
に基づく完全な順序を取得するまでメッセージを格納します。メッセージは、正しい順序になるとすぐに処理されます。
SequenceId
に基づく正しい順序のメッセージは、メッセージ自体のトランザクションで1つずつ非同期に処理されます。標準リシーケンサのルーティング・サービスのアウトバウンド・サービスへのメッセージは、確実に正しい順序で到着するので注意する必要があります。標準リシーケンサはメッセージの内容を変更せず、配列します。
BestEffortリシーケンサ
Oracle ESB Resequencerは、BestEffort
パターンをサポートします。この方式は、短時間で多数のメッセージを作成するためOracle ESB Resequencerに識別子順序を通知できないアプリケーションに関連しています。ESBは、次のように、確実に正しい順序でメッセージを送信をするために最大限の努力をします。Oracle ESB BestEffort
リシーケンサは、正しい順序の、または少しだけ順序が不正なメッセージ・ストリームを受信できます。メッセージは、正しい順序になるとすぐに処理されます。このリシーケンサは、SequenceId
の情報がなくてもメッセージを並べ替えできます。つまり、標準リシーケンサで行うような順序を定義しません。
BestEffortリシーケンサは、内部データ・ストアを使用して、非同期に処理されるまでメッセージを格納します。メッセージは、正しい順序を取得できるかどうかに関係なく、指定されたSequenceId
とその時点で到着しているメッセージに基づく順序で処理されます。BestEffort
ルーティング・サービスのアウトバウンド・サービスへのメッセージは、確実にSequenceId
に基づく順序で到着するので注意する必要があります。このBestEffortリシーケンサは、メッセージの内容を変更せず、正しい順序でメッセージ送信を試行するのみです。
順序の並べ替えがBestEffort
リシーケンサの場合、日時データを使用してメッセージを順序付けできます。このためには、エンドポイント・プロパティResequencerSequenceIdDataType
を追加する必要があります。このプロパティは、ResequencerSequenceIdXPath
のデータ型をxsd:dateTime
と指定します。これにより、リシーケンサは、xsd:dateTime
型に基づいてResequencerSequenceIdXPath
を解釈し、メッセージを順序付けします。
Oracle Resequencerは、ESBランタイムに新しい3つのスレッド・プールを追加します。これは、並べ替えのためにキューしたメッセージを送信するのに使用されます。
ロッカー・スレッド
ロッカー・スレッドを使用して、作業キューを移入します。ロッカー・スレッドは定期的にデータベース表を検索し、ワーカー・スレッドにより処理が可能なグループIDを検出します。ロッカー・スレッドは、これらのグループIDを作業キューに入れます。
ワーカー・スレッド
ワーカー・スレッドは、作業キューからグループIDを選択し、並べ替えロジックを実行します。
ハートビート・スレッド
ハートビート・スレッドは、クラッシュ・コンテナによりロックされたグループのロック解除に使用されます。このスレッドのインスタンスは1つのみ存在します。
注意: リシーケンサを使用するOracle ESBのサンプルについては、次のURLを参照してください。
|
この項では、並べ替え機能の使用方法について説明します。ESBベースのアプリケーション開発時およびデプロイされたアプリケーションの管理時に、アプリケーション設計および開発段階で並べ替え機能を使用します。ここでは、次の項目について説明します。
開発
アプリケーションの設計および開発段階で、次の手順を実行することによりルーティング・サービスの並べ替えのサポートを有効にできます。
ESBの並べ替えサポートの有効化: ESB構成パラメータEnableResequencer
(esb_config.ini
ファイル内またはESB起動時に-DEnableResequencer
オプションを使用)の値をtrue
に設定します。このESB構成パラメータの値を設定して、ルーティング・サービスも順序付けする必要があります。
ルーティング・サービスの並べ替えサポートの有効化: ResequencerType
エンドポイント・プロパティを、Standard
、BestEffort
またはFIFO
に設定します。ESB構成パラメータEnableResequencer
(esb_config.ini
ファイル内またはESB起動時に-DEnableResequencer
オプションを使用)の値をtrue
に設定する必要もあります。
グループIDフィールドの指定: 着信メッセージ内のグループ識別子フィールドを指定するResequencerGroupXPath
エンドポイント・プロパティ式を設定します。グループIDフィールド値が同じ全メッセージは、(ResequencerTypeの)並べ替えが実行される着信メッセージ・セットを形成します。ResequencerGroupXPath
を指定しない場合、ルーティング・サービスが受信する全メッセージは1つのグループに属します。
グループID XPathおよびシーケンスID XPathは、次のフォーマットを使用します。
{<<expression>>};{namespace ns1=<namespace url> namespace ns2=<namespaceurl>...}.
フォーマットは、サブスクリプション・フィルタで使用するものと同じです。XPathの例は、次のとおりです。
{//ns1:owner};{namespacens1=http://www.w3schools.com}
追加のエンドポイント・プロパティを設定して、目的の並べ替えを構成する必要があります。このような追加プロパティは目的の並べ替えにより異なります。手順4の表を参照してください。
標準並べ替えの構成: 次の表に示すエンドポイント・プロパティを指定します。
Sl.番号 | エンドポイント・プロパティ名 | 説明 |
---|---|---|
1. | ResequencerSequenceIdXPath |
並べ替えが実行される着信メッセージのフィールドを指すXPath |
2. | ResequencerTimeout |
予期するメッセージを待機するミリ秒単位の期間。リシーケンサは、タイムアウトが発生するとグループをエラーとしてロックします。ロックされたグループの新規メッセージが到着すると、そのグループのロックを解除します。タイムアウトのデフォルト値はLong.MAX_VALUE です。
関連項目: このエンドポイント・プロパティの制限事項については、「リシーケンサのタイムアウト機能」を参照してください。 |
3. | ResequencerSequenceStart およびResequencerSequenceIncrement |
識別子順序は自然数順序で、ユーザーはSEQUENCE_START 値とSEQUENCE_INCREMENT 値を指定する必要があります。これら両プロパティのデフォルト値は1です。 |
BestEffort並べ替えの構成: 次の表に示すエンドポイント・プロパティを指定します。
Sl.番号 | エンドポイント・プロパティ名 | 説明 |
---|---|---|
1. | ResequencerSequenceIdXPath |
並べ替えが実行される着信メッセージのフィールドを指すXPath |
2. | ResequencerSequenceIdDataType |
このプロパティ値をdateTime に設定して、xsd:dateTime 型の入力を渡します。(http://www.w3schools.com/Schema/schema_dtypes_date.asp)。デフォルトで、データ型は数字と見なされます。 |
FIFO並べ替えの構成: 次の表に示すエンドポイント・プロパティを指定します。
Sl.番号 | エンドポイント・プロパティ名 | 説明 |
---|---|---|
1. | ResequencerSequenceIdXPath |
並べ替えが実行される着信メッセージのフィールドを指すXPath |
デキュー・システムの構成
リシーケンサ対応ルーティング・サービスでは、ESBはデータベースに着信メッセージをエンキューします。リシーケンサのデキュー・システムは、ロッカー・スレッドとワーク・スレッド・プールで構成されます。ロッカー・スレッドとワーク・スレッド・プールは1つのシステムに関連付けられています。それぞれのシステムが独自のロッカー・スレッドとワーカー・スレッド・プールを保有します。ロッカー・スレッドは、グループをロックして同時アクセスを回避し、ロックしたグループをワーカー・スレッド・プールに渡します。ワーカー・スレッド・プールは、ロックされたグループの大量のメッセージを検索し、メッセージを処理します。次の表で、デキュー・システムを構成するパラメータについて説明します。
名前 | タイプ | 説明 | デフォルト値 |
---|---|---|---|
ResequencerMaxGroupsLocked |
ECP | 処理のためデキュー・システムによりロックされたグループの数。 | 全有効グループ数。 |
ResequencerMaxRowsRetrieved |
EPP | リシーケンサが一度にデータ・ストアから選択する必要のある、正しい順序のメッセージ数。 | BestEffort では1、標準およびFIFOでは5。 |
ResequencerWorkerThreadPoolSize |
ECP | メッセージ処理用システム単位スレッド数。 | 1 |
systemName_ResequencerWorkerThreadPoolSize |
ECP | メッセージ処理用システム単位スレッド数。このパラメータ値は、特定のシステムのResequencerWorkerThreadPoolSize パラメータ値を上書きします。 |
1 |
ResequencerLockerThreadSleep |
ECP | デキュー・システム・スレッドが処理するグループを検索しない場合の、ミリ秒単位のスリープ時間。 | 2000ミリ秒 |
この場合、EPPはエンドポイント・プロパティ(End Point Property)、ECPはESB構成パラメータ(ESB Configuration Parameter)です。
ハートビート・インフラストラクチャの構成
リシーケンサのデキュー・システムは、グループをロックした後、グループのメッセージを処理します。デキュー・システムは、インスタンス識別子(ID)を使用してグループをロックします。ハートビート・インフラストラクチャは、インスタンスIDを作成し保持します。どのESBインスタンスにも1つのインスタンスIDがあります。ハートビート・インフラストラクチャは、ESBインスタンス用にこの一意インスタンスIDを作成します。インスタンスIDは、ESB_CONTAINERID_LEASE
表に現行時刻とともに挿入されます。
ハートビート・インフラストラクチャは、1つのハートビート・スレッドを保有します。ハートビート・スレッドは、インスタンスIDに関連付けられている時刻を定期的に更新し、他のESBインスタンスにその存在を通知します。このために、ESB構成パラメータResequencerContainerIdLeaseRefresh
を分単位で指定して使用します。このパラメータのデフォルト値は10分です。
ハートビート・スレッドは、構成可能期間内でまだ更新されていないインスタンスIDも検索します。このために、ESB構成パラメータResequencerContainerIdLeaseTimeout
を分単位で指定して使用します。このパラメータのデフォルト値は15分です。スレッドは、これらのインスタンスIDが保持するロックを解除します。グループのロックが解除されると、他のESBインスタンスのデキュー・システムは処理するグループを選択できます。
管理
管理タスクでは、ESBのリシーケンサ・サポートの管理を処理します。このリリースでは、次の管理タスクがサポートされています。
エラー生成メッセージの再送信
エラーを生成するメッセージはエラー・ホスピタルに移されます。グループはエラー状態に移され、どのESBインスタンスのデキュー・システムによっても選択されません。ユーザーは、エラー・ホスピタルを使用して、エラー生成メッセージを再送信できます。メッセージの再送信時、グループは通常状態に移されるので、ESBインスタンスのデキュー・システムによって選択可能になります。
タイムアウト・グループの管理
タイムアウト・グループは、処理には選択されません。resequencer_list_timedout_groups.sql
SQLスクリプトを使用して、タイムアウト・グループのルーティング・サービスGUID、グループIDおよびグループ名をリストできます。この情報をresequencer_restart_processing_group.sql
SQLスクリプトに渡せるため、グループは処理のため再び開かれます。
メッセージ・ストアの消去
リシーケンサは受信メッセージを削除しません。したがって、手動で消去スクリプトを実行して、指定のタイムスタンプより古い処理済メッセージを消去する必要があります。消去スクリプトはPL/SQLプロシージャresequencer_purge_messages
であり、resequencer_purge_message_store.sql
ファイルにあります。
注意: このスクリプトを使用する際は、誤ってメッセージを削除しないように注意してください。 |
たとえば、次のコマンドを使用して指定のタイムスタンプよりインスタンスをすべて削除します。
resequencer_purge_messages(to_timestamp('2006-05-11 00:00:00','YYYY-MM-DD HH24:MI:SS'))
また、次のコマンドを使用して、120日を超えて経過したインスタンスをすべて削除します。
resequencer_purge_messages(SYSDATE - 120)
ロックされたグループの管理
プロジェクトがアンデプロイされると、ルーティング・サービス対応リシーケンサのメッセージは拒否されます。メッセージがすでにデータ・ストア内にあり処理用に選択されている場合、ルーティング・サービスのメタデータが有効ではないため、リシーケンサ・デキュー・システムはそのメッセージを処理することができずグループをロックします。そのようなロックされたグループは、resequencer_list_erroredout_groups.sql
ファイル内のPL/SQLプロシージャを使用してリストできます。このプロシージャは、プロジェクトがアンデプロイされたためエラー状態になったグループの、グループ識別子およびルーティング・サービスGUIDをリストします。グループIDおよびルーティング・サービスGUIDをresequencer_restart_processing_group.sql
プロシージャに渡すと、グループを処理のため再び開くことが可能です。
このリリースでは、リシーケンサには次のような制限事項があります。
リシーケンサ・タイプの変更はサポートされない
リリース10.1.3.4では、ESBには3タイプの並べ替えがあります。ResequencerType
エンドポイント・プロパティ値をStandard
、BestEffort
、FIFO
のいずれかに設定して、ルーティング・サービスに必要な並べ替えのタイプを設計時に指定します。リシーケンサ・ランタイムは、メッセージ順序の状態に関する情報を保持し、この情報を使用して、次のメッセージを処理用に選択します。
リリース10.1.3.4では、設計時のリシーケンサ・タイプの変更はサポートされていません。リシーケンサ・タイプを変更すると、メッセージ順序の状態情報が破損するためです。これにより、メッセージが処理のため選択されないなどの望ましくない影響を及ぼすことがあります。
この問題は、Oracle Bug#7117296で追跡されます。
リシーケンサのタイムアウト機能
標準リシーケンサでは、エンドポイント・プロパティResequencerTimeout
を使用して、リシーケンサがグループの次のメッセージを待機する時間を設定できます。ResequencerTimeout
期間内に次のメッセージを受信しない場合、リシーケンサはタイムアウト状態のグループにマークをつけるため、グループは処理用に選択されません。
リリース10.1.3.4では、タイムアウト機能は利用できません。これは、タイムアウト状態のグループを処理のために開く簡単な方法がないためです。現在、タイムアウト機能では、タイムアウト状態のグループを開くにはSQLを使用する必要があります。このリリースでは、ResequencerTimeout
エンドポイント・プロパティのデフォルト値はLong.MAX_VALUE
(http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Long.html#MAX_VALUE)に設定されています。
この問題は、Oracle Bug#7117346で追跡されます。
リシーケンサ・エンドポイントは同一システム上にある必要がある
リシーケンサがルーティング・サービスで有効な場合、そのルーティング・サービスの全ルーティング・ルールは同システム上にあるエンドポイントに接続している必要があります。
このように、異なるシステムに属するルーティング・ルール・ターゲットでは、リシーケンサ対応のルーティング・サービスにインタフェースされている必要があります。
この問題は、Oracle Bug#7143449で追跡されます。
XSDファイルにサーバー・ロケール・エンコーディングがサポートしていないマルチバイト・キャラクタがある場合、リシーケンサが失敗する
XSDファイルにサーバー・ロケール・エンコーディングがサポートしていないマルチバイト・キャラクタがある場合、リシーケンサの実行は、プロジェクト・フローのトリガー後失敗します。ESBコントロールも障害を示します。
この問題は、Oracle Bug#7218685で追跡されます。
この項では、データベース・アダプタおよびファイル・アダプタをFIFO形式で動作するように構成する方法について説明します。
ファイル・アダプタの場合は次の処理を実行します。
次の手順を実行してプロセッサ・スレッドの数を1に設定します。
$ORACLE_HOME\integration\esb\config\pc.properties.esb
ファイルの名前を$ORACLE_HOME\integration\esb\config\pc.properties
に変更し、oracle.tip.adapter.file.numProcessorThreads
パラメータ値を1に設定します。
$ORACLE_HOME\bpel\system\service\config\pc.properties
ファイルを編集し、oracle.tip.adapter.file.numProcessorThreads
パラメータ値を1に設定します。このパラメータのデフォルト値は4です。
注意: SOAのインストールでは、BPELファイル $ORACLE_HOME\bpel\system\service\config\pc.properties に指定されている設定が対応するESB設定に優先します。したがって、このBPELファイルを編集してESBにとって正しい構成設定にする必要があります。 |
次の手順を実行してインバウンド・アダプタを構成します。
JDeveloperで、インバウンド・ファイル・アダプタのWSDLファイルを編集して、次のようにActivationSpec
にSorter="oracle.tip.adapter.file.sorter.TimestampSorterAscending"
を追加します。
<jca:operation PhysicalDirectory="/home/Xiaocheng/oracle/product/10.1.3.1soa/resequencer/resequencer/F2Fdata/in" ActivationSpec="oracle.tip.adapter.file.inbound.FileActivationSpec" Sorter="oracle.tip.adapter.file.sorter.TimestampSorterAscending" DeleteFile="true" IncludeFiles=".*\.xml" PollingFrequency="3" MinimumAge="2" OpaqueSchema="false" > </jca:operation>
注意: このファイルに加えられた変更は、この時点では有効ではありません。 |
ファイルを保存します。
JDeveloperで、インバウンド・ファイル・アダプタの.esbsvc
ファイルを開きます。
「技術アダプタ・サービスのWSDLを構成します」をクリックし、WSDLファイルを変更しないでウィザードに従います。
ファイルを保存します。
再度インバウンド・ファイル・アダプタのWSDLファイルを開き、手順1で行った設定が変更されていないか、またファイルが次のようになっているかを確認します。
<jca:operation PhysicalDirectory="/home/Xiaocheng/oracle/product/10.1.3.1soa/resequencer/resequencer/F2Fdata/in" ActivationSpec="oracle.tip.adapter.file.inbound.FileActivationSpec" Sorter="oracle.tip.adapter.file.sorter.TimestampSorterAscending" DeleteFile="true" IncludeFiles=".*\.xml" PollingFrequency="3" MinimumAge="2" OpaqueSchema="false" > </jca:operation>
再度ESBでプロジェクトを登録します。
登録完了の通知を受け取ります。
注意:
|
データベース・アダプタの場合は次の処理を実行します。
次の手順を実行してデータベース・スレッドの数を1に設定します。
JDeveloperで、インバウンド・データベース・アダプタのWSDLファイルを開きます。
次のようにNumberOfThreads
パラメータ値を1に設定します。
<jca:operation ActivationSpec="oracle.tip.adapter.db.DBActivationSpec" DescriptorName="GetTransactions.OrderTransactionsFifo1" QueryName="GetTransactions" PollingStrategyName="DeletePollingStrategy" SequencingFieldName="TS" MaxRaiseSize="1" MaxTransactionSize="unlimited" PollingInterval="5" NumberOfThreads="1" UseBatchDestroy="false" ReturnSingleResultSet="false" MappingsMetaDataURL="GetTransactions_toplink_mappings.xml" />
ファイルを保存します。
表に行を挿入するときは、タイムスタンプを格納するための列を追加して、データベース・アダプタの構成時、この列でソートできるようにします。それには、次の手順を実行します。
JDeveloperで、インバウンド・ファイル・アダプタの.esbsvc
ファイルを開きます。
「技術アダプタ・サービスのWSDLを構成します」をクリックし、ウィザードに従います。
「表の選択」ページで、再度データベース・アダプタの表をインポートし、新規追加されたタイムスタンプ列を追加します。
表に主キーがない場合、タイムスタンプ列を仮想主キーとして指定します。
「ポーリング・オプション」ページで、「ソート順」フィールドの値としてタイムスタンプを指定します。
ファイルを保存します。
再度WSDLファイルを開き、SequencingFieldName
がタイムスタンプ列(TS)の列名として設定されているかどうかを確認します。WSDLファイルは次のようになります。
<jca:operation ActivationSpec="oracle.tip.adapter.db.DBActivationSpec" DescriptorName="GetTransactions.OrderTransactionsFifo1" QueryName="GetTransactions" PollingStrategyName="DeletePollingStrategy" SequencingFieldName="TS" MaxRaiseSize="1" MaxTransactionSize="unlimited" PollingInterval="5" NumberOfThreads="1" UseBatchDestroy="false" ReturnSingleResultSet="false" MappingsMetaDataURL="GetTransactions_toplink_mappings.xml" />
再度ESBでプロジェクトを登録します。
登録完了の通知を受け取ります。