ヘッダーをスキップ
Oracle Enterprise Service Bus 開発者ガイド
10g (10.1.3.4.0)
B50869-02
  目次
目次
索引
索引

戻る
戻る
 
次へ
次へ
 

11 並べ替えのサポート

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を参照してください。
http://www.oracle.com/technology/products/integration/esb/index.html

リシーケンサの使用方法

この項では、並べ替え機能の使用方法について説明します。ESBベースのアプリケーション開発時およびデプロイされたアプリケーションの管理時に、アプリケーション設計および開発段階で並べ替え機能を使用します。ここでは、次の項目について説明します。

開発

アプリケーションの設計および開発段階で、次の手順を実行することによりルーティング・サービスの並べ替えのサポートを有効にできます。

  1. ESBの並べ替えサポートの有効化: ESB構成パラメータEnableResequenceresb_config.iniファイル内またはESB起動時に-DEnableResequencerオプションを使用)の値をtrueに設定します。このESB構成パラメータの値を設定して、ルーティング・サービスも順序付けする必要があります。

  2. ルーティング・サービスの並べ替えサポートの有効化: ResequencerTypeエンドポイント・プロパティを、StandardBestEffortまたはFIFOに設定します。ESB構成パラメータEnableResequenceresb_config.iniファイル内またはESB起動時に-DEnableResequencerオプションを使用)の値をtrueに設定する必要もあります。

  3. グループ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の表を参照してください。

  4. 標準並べ替えの構成: 次の表に示すエンドポイント・プロパティを指定します。

    Sl.番号 エンドポイント・プロパティ名 説明
    1. ResequencerSequenceIdXPath 並べ替えが実行される着信メッセージのフィールドを指すXPath
    2. ResequencerTimeout 予期するメッセージを待機するミリ秒単位の期間。リシーケンサは、タイムアウトが発生するとグループをエラーとしてロックします。ロックされたグループの新規メッセージが到着すると、そのグループのロックを解除します。タイムアウトのデフォルト値はLong.MAX_VALUEです。

    関連項目: このエンドポイント・プロパティの制限事項については、「リシーケンサのタイムアウト機能」を参照してください。

    3. ResequencerSequenceStartおよびResequencerSequenceIncrement 識別子順序は自然数順序で、ユーザーはSEQUENCE_START値とSEQUENCE_INCREMENT値を指定する必要があります。これら両プロパティのデフォルト値は1です。

  5. BestEffort並べ替えの構成: 次の表に示すエンドポイント・プロパティを指定します。

    Sl.番号 エンドポイント・プロパティ名 説明
    1. ResequencerSequenceIdXPath 並べ替えが実行される着信メッセージのフィールドを指すXPath
    2. ResequencerSequenceIdDataType このプロパティ値をdateTimeに設定して、xsd:dateTime型の入力を渡します。(http://www.w3schools.com/Schema/schema_dtypes_date.asp)。デフォルトで、データ型は数字と見なされます。

  6. 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のリシーケンサ・サポートの管理を処理します。このリリースでは、次の管理タスクがサポートされています。

リシーケンサの制限事項

このリリースでは、リシーケンサには次のような制限事項があります。

リシーケンサ・タイプの変更はサポートされない

リリース10.1.3.4では、ESBには3タイプの並べ替えがあります。ResequencerTypeエンドポイント・プロパティ値をStandardBestEffortFIFOのいずれかに設定して、ルーティング・サービスに必要な並べ替えのタイプを設計時に指定します。リシーケンサ・ランタイムは、メッセージ順序の状態に関する情報を保持し、この情報を使用して、次のメッセージを処理用に選択します。

リリース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用のデータベース・アダプタおよびファイル・アダプタの構成

この項では、データベース・アダプタおよびファイル・アダプタをFIFO形式で動作するように構成する方法について説明します。

ファイル・アダプタ

ファイル・アダプタの場合は次の処理を実行します。

  1. 次の手順を実行してプロセッサ・スレッドの数を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にとって正しい構成設定にする必要があります。

  2. 次の手順を実行してインバウンド・アダプタを構成します。

    1. JDeveloperで、インバウンド・ファイル・アダプタのWSDLファイルを編集して、次のようにActivationSpecSorter="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>
      

      注意:


      このファイルに加えられた変更は、この時点では有効ではありません。

    2. ファイルを保存します。

    3. JDeveloperで、インバウンド・ファイル・アダプタの.esbsvcファイルを開きます。

    4. 「技術アダプタ・サービスのWSDLを構成します」をクリックし、WSDLファイルを変更しないでウィザードに従います。

    5. ファイルを保存します。

    6. 再度インバウンド・ファイル・アダプタの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>
      
  3. 再度ESBでプロジェクトを登録します。

    登録完了の通知を受け取ります。


注意:

  • 設定完了後、ファイル・アダプタは、確実にファイルのタイムスタンプに基づいてファイルをESBルーティング・サービスに送信します。ただし、ls --full-timeコマンドを使用してファイルのタイムスタンプを確認すると、時間は'2008-06-25 09:36:45.000000000 +0800'のように表示されます。つまり、粒度は秒のレベルです。したがって、複数のファイルをアダプタのフォルダにコピーするのが速すぎると、それらのファイルが同じタイムスタンプを持つことになります。そのような状況では、複数のメッセージが同じ到着時刻を保有しているため、この回避策では順序が必ずしもFIFOになりません。

  • スレッドを作成する場合、ファイルのコピー時に1000ミリ秒スリープすると、確実にファイルごとに異なるタイムスタンプが得られます。


データベース・アダプタ

データベース・アダプタの場合は次の処理を実行します。

  1. 次の手順を実行してデータベース・スレッドの数を1に設定します。

    1. JDeveloperで、インバウンド・データベース・アダプタのWSDLファイルを開きます。

    2. 次のように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" />
      
    3. ファイルを保存します。

  2. 表に行を挿入するときは、タイムスタンプを格納するための列を追加して、データベース・アダプタの構成時、この列でソートできるようにします。それには、次の手順を実行します。

    1. JDeveloperで、インバウンド・ファイル・アダプタの.esbsvcファイルを開きます。

    2. 「技術アダプタ・サービスのWSDLを構成します」をクリックし、ウィザードに従います。

    3. 「表の選択」ページで、再度データベース・アダプタの表をインポートし、新規追加されたタイムスタンプ列を追加します。

    4. 表に主キーがない場合、タイムスタンプ列を仮想主キーとして指定します。

    5. 「ポーリング・オプション」ページで、「ソート順」フィールドの値としてタイムスタンプを指定します。

    6. ファイルを保存します。

    7. 再度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" />
      
  3. 再度ESBでプロジェクトを登録します。

    登録完了の通知を受け取ります。