この章の内容は次のとおりです。
メディエータの再シーケンサは、関連がありながらも順序が正しくないメッセージを適切な順序に並べ替えます。受信メッセージが到着すると、それらはランダムな順序になっています。リシーケンサは、順次または時系列の情報に基づきメッセージを順序付け、メッセージをターゲット・サービスに対して正しい手順で送信します。順序付けは、選択した順序付け戦略に基づき実行されます。
リシーケンサでは、グループと順序IDの2つの中心的な概念が使用されます。順序IDはメッセージの識別子の部分で、メッセージはこの識別子に基づいて再編成されます。再順序付けのために着信したメッセージは、複数のグループに分割され、各グループ内のメッセージは順序IDに従って順序付けされます。グループ内の順序付けは、他のグループのメッセージの順序とは独立して実行されます。グループ自体は相互に依存していないため、独立して処理できます。
たとえば、特定のグループに添付されているメッセージは、次の順序でメディエータ・サービス・コンポーネントに着信します。
msg9(a)、msg8(b)、msg7(a)、msg6(c)、msg5(a)、msg4(b)、msg3(c)、msg2(b)、msg1(a)
表23-1 に、メディエータがメッセージを複数のグループにソートする方法を示します。各グループ内のメッセージの順序は、使用している再シーケンサのタイプによって異なります。
表23-1 複数のグループにソートされるメッセージ
グループc | グループb | グループa |
---|---|---|
msg6(c)、msg3(c) |
msg8(b)、msg4(b)、msg2(b) |
msg9(a)、msg7(a)、msg5(a)、msg1(a) |
すべてのグループは相互に独立して処理され、あるグループで発生したエラーが、他のグループの処理に影響を与えることはありません。
グループIDと順序IDは、メッセージ・ペイロードおよびヘッダーのXPath式を介して識別されます。グループ化および順序付けが完了したメッセージ・ペイロードの要素を指し示すXPath式を指定します。
図23-1 に示すメッセージ・ペイロードでは、CustomerId
がインスタンス順序付けのベースとなるフィールドで、Type
がグループ化のベースとなるフィールドです。
注意:
再順序付けは、同期操作ではサポートされません。
メディエータでは、ユーザーが指定した順序で着信メッセージを再順序付けできます。この実装によって、3種類の再順序付けの順序を指定できます。
標準再シーケンサは、標準再シーケンサ・パターンをサポートしています。次の各項では、標準再シーケンサおよびメッセージの処理方法について説明します。
標準再シーケンサは、メッセージ内の単純な識別子の連番から識別子を使用するアプリケーションに役立ちます。標準再シーケンサは一連のメッセージを受信しますが、これらのメッセージは順序に従って着信しない可能性があります。この場合、順序IDに基づいた完全な順序を受信するまで、メッセージは順不同で格納されます。正しい順序のメッセージは、そのメッセージの順序IDに基づいて非同期で処理されます。
標準再シーケンサであるメディエータ・サービス・コンポーネントのアウトバウンド・サービスへのメッセージは、順番に着信することが保証されている点に注意してください。
メディエータの標準の再シーケンサを使用する場合は、常にグループXPath式と順序ID XPath式を指定する必要があります。これらは、メディエータの再シーケンサがメッセージでグループおよび順序IDを検索できる場所を指定します。また、開始順序IDと順序IDの増分デルタに関して順序番号を指定する必要があります。この番号付けは、各グループを形成する際に使用されます。グループ、順序IDおよび増分プロパティに加えて、予期されているメッセージを待機するタイムアウト時間(秒単位)を指定することもできます。
メディエータの標準再シーケンサでは、様々なグループに対して適切な順序を作成できるようになるまで、メディエータの再シーケンサ・データベースにメッセージが保持されます。この状況は、指定のグループについて、特定の順序IDのメッセージがタイムアウト時間内に着信しない場合は、そのグループの後続のメッセージが永久に保持されることを意味します。このような場合は、Oracle Enterprise Manager Fusion Middleware Controlを介してグループのロックを手動で解除して次のメッセージに進み、保留中のメッセージをスキップする必要があります。
表23-2 に、複数のグループが、増分デルタの2つの異なる値に対してどのように形成されるかを示します。
表23-2 2つの異なる値に対する複数グループの形成
開始順序ID | 増分デルタ | Group1 | Group2 | ... | グループn |
---|---|---|---|---|---|
1 |
1 |
1,2,3,4,5,... |
1,2,3,4,5,... |
... |
1、2、3、4、5、...n |
1 |
5 |
1,5,10,15,... |
1,5,10,15,... |
... |
1,5,10,15,... |
注意:
様々なグループで順序番号が異なり(たとえば、各グループに同じ増分デルタまたは開始順序IDがない場合)、メッセージも正しい順序で着信しない場合は、メッセージを再編成するためにベスト・エフォート再シーケンサを使用できます。
FIFO再シーケンサは、標準の先入れ先出し(FIFO)パターンをサポートしています。次の各項では、FIFO再シーケンサおよびメッセージの処理方法について説明します。
FIFO再シーケンサは、メディエータへのメッセージの着信時刻に基づいて順序付けする必要があるアプリケーションに役立ちます。FIFO再シーケンサは、順序に従って一連のメッセージを受信し、メッセージの着信時刻に基づいて、各グループのメッセージを順に処理します。
FIFO再シーケンサとして機能するメディエータのアウトバウンド・サービスへのメッセージは、着信時刻に基づいて順に着信することが保証されている点に注意してください。したがって、メッセージは、再シーケンサ・データ・ストアに格納された順に配信されます。
FIFO再シーケンサを使用する場合は、常にグループXPath式を指定する必要があります。ただし、メッセージはFIFO再シーケンサとして構成されているメディエータ・サービス・コンポーネントへの着信時刻に従って処理されるため、順序IDを指定する必要はありません。グループXPath式では、FIFO再シーケンサがメッセージのグループ化のために、メッセージ内のグループ情報を検索する場所を指定します。FIFOパターンに必要な構成は他にはありません。
表23-3 に、FIFO再シーケンサの動作を示します。msgX(Y,Z)
は、メッセージがメディエータ・サービス・コンポーネントへのメッセージ番号Xとして着信し、そのメッセージにsequenceID
YとグループZが格納されていることを意味します。
表23-3 FIFO 再シーケンサの動作
着信メッセージ | 順序付けされたメッセージ |
---|---|
msg12(4,c) msg05(9,a) msg02(7,a) msg10(3,c) msg10(3,a) msg07(5,a) msg06(1,c) msg03(2,c) |
msg12(4,c)、msg10(3,c)、msg06(1,c)、msg03(2,c) msg05(9,a)、msg02(7,a)、msg10(3,a)、msg07(5,a) |
表23-3 に示すように、メッセージは着信時刻に基づいて順序付けされ、sequenceID
は順序付けに使用されません。
注意:
FIFO再シーケンサを使用する場合は、シングル・スレッドのインバウンド・アダプタを使用して不測の結果を回避してください。たとえば、FIFO再シーケンサとして構成されているメディエータ・サービス・コンポーネントの前で、ファイル/FTPアダプタ、データベース・アダプタまたはAQアダプタを使用する場合、シングル・スレッド処理のアダプタを構成してください。シングル・スレッド用に構成しないと、各メッセージの着信時刻がアダプタ・サービスへのメッセージ着信時ではなく、メディエータ・サービス・コンポーネントへの着信時に計算されるため、不測の結果が発生します。
メディエータの再シーケンサは、ベスト・エフォート・パターンをサポートしています。次の各項では、ベスト・エフォート再シーケンサおよびメッセージの処理方法について説明します。
短期間に多数のメッセージを生成し、順序付けに使用する識別子の情報を再シーケンサに提供できないアプリケーションには、ベスト・エフォート・パターンが役立ちます。通常、このようなシナリオで順序付けに使用される識別子は、dateTime
タイプまたはnumeric
タイプです。dateTime
フィールドを順序ID XPathとして使用すると、順序付けを制御できます。メッセージはアプリケーションから順に送信されることが想定されるため、メッセージの送信日時を使用して順序付けができます。メディエータは、メッセージが順序に従って配信されるように最善の方法を取ります。
ベスト・エフォート再シーケンサでは、順序IDの増分に関する認識に基づくことなくメッセージを並べ替えることができます。この状況は、標準再シーケンサとは異なり、ベスト・エフォート再シーケンサには、順序IDの増分を事前に定義する必要がないことを意味します。本来の順序を受信しても、メッセージの処理時には、メッセージは指定した順序IDと着信したメッセージに基づいて順に処理されます。順序IDは、numeric
またはdateTime
のいずれかです。したがって、順序付けは、順序IDの数値またはdateTime
の順に発生します。
ベスト・エフォート再シーケンサは、2つのメッセージ選択方法である最大行数選択または時間ウィンドウのいずれかに基づいて、メッセージを非同期で処理します。同時に選択および処理されたメッセージは、指定する最大行数またはメッセージが着信する時間ウィンドウのいずれかに基づいて処理されます。
ベスト・エフォート再シーケンサが最大行数を使用するように構成されていると、再シーケンサ・データベースで新しいメッセージが使用可能な場合は常に、次の手順が実行されます。
再シーケンサは、指定した順序ID (通常は、日付およびタイム・スタンプ)に従ってメッセージを順序付けします。
再シーケンサは、前述の順序付けメッセージからmaxRowsRetrieved
パラメータの値と等しいメッセージ数をロックして選択します。
再シーケンサは、選択したメッセージを自身のトランザクションで1つずつ順に処理します。
ベスト・エフォート再シーケンサが最大行数ではなく時間ウィンドウを使用するように構成されていると、一度に選択および処理するメッセージは、指定する一定の期間に加えてオプションのバッファ時間に基づいて処理されます。各メッセージは特定の時間ウィンドウに属し、ある時間ウィンドウにあるメッセージは異なる時間ウィンドウに属しているメッセージとは別に処理されます。
時間ウィンドウに加えてバッファ時間を指定できます。バッファ時間は、連続する2つの時間ウィンドウの重複部分で、最初の時間ウィンドウに関連するメッセージを少し後で着信させることができます。デフォルトでは、バッファ時間は指定した時間ウィンドウの10%です。
ベスト・エフォート再シーケンサが時間ウィンドウを使用するように構成されていると、グループは反復方法で処理され、メッセージは次の手順で処理されます。
最初のメッセージが着信すると、タイム・ウィンドウが開始されます。
バッファが時間ウィンドウに追加され、バッファ時間の後に処理が開始されます。
再シーケンサは時間ウィンドウ内に着信したメッセージを取得し、すべてのメッセージから最大順序ID (通常は、日付およびタイム・スタンプ)を識別します。
再シーケンサは、バッファ時間内に着信し、上で識別した最大順序IDより小さい順序IDを持つすべてのメッセージを取得します。
再シーケンサは、前述の手順で取得したすべてのメッセージを順序IDの昇順でソートし、メッセージを処理します。
ベスト・エフォート再順序付け用に構成されたメディエータ・サービス・コンポーネントのアウトバウンド・サービスへのメッセージは、順序IDの順に着信することが保証されていない点に注意してください。任意の時点で、使用可能なメッセージのスナップショットが取得され、それらのメッセージのみを対象として順序付けが実行されます。したがって、標準再シーケンサとは異なり、先に着信した大きい順序ID値のメッセージより前に、小さい順序ID値のメッセージが送信される保証はありません。後に到着した小さい順序ID値のメッセージは、使用可能なメッセージのスナップショットの再取得とメッセージの再順序付けが行われる次のサイクルで処理される場合があります。
ベスト・エフォート再シーケンサを使用する場合は、グループXPath式、順序ID XPath式、および順序IDのデータ型(numeric
またはdateTime
)を指定する必要があります。これらは、再シーケンサがメッセージでグループと順序IDを検索する場所、および順序IDの処理方法を指定します。また、各順序付けバッチを選択するための最大行数、または1つのバッチに含まれるメッセージが着信する時間ウィンドウを指定する必要もあります。
標準再シーケンサとは異なり、ベスト・エフォート再シーケンサには、順序の作成方法に関する認識はありません。ベスト・エフォート再シーケンサでの処理に使用される情報は他にはありません。
表23-4 に、ベスト・エフォート再シーケンサが処理するメッセージを判別するために最大行数を使用するよう構成されている場合の動作を示します。この例では、msgX(Y,Z)
は、メッセージがメディエータ・サービス・コンポーネントへのメッセージ番号Xとして着信し、そのメッセージにsequenceID
Yとgroup
Zが格納されていることを示しています。
表23-4 最大行数に基づいたベスト・エフォート再シーケンサの動作
グループC | 順序付けされたメッセージ |
---|---|
msg03(1,c) msg06(2,c) msg10(3,c) msg12(4,c) |
msg12(4,c)、msg10(3,c)、msg06(2,c)、msg03(1,c) |
注意:
ベスト・エフォート再シーケンサが正しく機能するには、メッセージが順番に、またはほぼ順番に着信する必要があります。そうでない場合、正しく再順序付けされません。メッセージが短い間隔で着信しない場合は、maxRowsRetrieved
の値を1
に設定すると、次のメッセージは着信までの時間の余裕ができ、次の処理ループで取得されます(したがって、順に配信されます)。
表23-5 に、ベスト・エフォート再シーケンサがメッセージの着信期間に基づいて処理するよう構成されている場合の動作を示します。この例では、時間帯は10分、バッファは10% (1分)で、msgX(Y)
は、メッセージがメディエータ・サービス・コンポーネントへのメッセージ番号Xとして着信し、そのメッセージに順序ID Yが格納されていることを示しています。最初のメッセージが2:00:00に着信すると、時間ウィンドウが開始されます。時間ウィンドウはバッファ時間を追加することで2:10:00まで継続され、2:11:00までに着信したメッセージが処理されます。
表23-5 時間ウィンドウに基づいたベスト・エフォート再シーケンサの動作
グループCメッセージ/時間 | 順序付けされたメッセージ |
---|---|
msg01(04)/2:00:00 msg02(05)/2:00:20 msg03(01)/2:00:30 msg04(03)/2:00:50 msg05(07)/2:04:20 msg06(02)/2:04:45 msg07(13)/2:05:10 msg08(08)/2:05:40 msg09(06)/2:08:40 msg10(12)/2:09:20 msg11(10)/2:10:30 msg12(09)/2:10:40 msg13(14)/2:10:50 msg14(11)/2:13:00 |
msg03(01)、msg06(02)、msg04(03)、msg01(04)、msg02(05)、msg09(06)、msg05(07)、msg08(08)、msg12(09)、msg11(10)、msg10(12)、msg07(13) |
注意:
前述の例で、再シーケンサは時間ウィンドウの最大順序IDを13(メッセージ7から)と識別しました。メッセージ13はバッファ時間内に着信しましたが、14の順序IDを持っています。メッセージは元のグループで処理されるかわりに、2:10:50の着信時間で新しい時間ウィンドウが開始されます。メッセージ14の着信は遅すぎたため、2番目の時間ウィンドウに含められます。
再シーケンサは、Oracle JDeveloperを使用して構成できます。この項では、Oracle JDeveloperでの再シーケンサの構成方法について説明します。
サービス・コンポーネント・レベルまたは操作レベルのいずれかで再順序付けを定義できます。1つの操作のみを使用するメディエータ・サービス・コンポーネントの場合、操作またはサービス・コンポーネント・レベルで再順序付けを構成しても、動作は同じになります。複数の操作を持つメディエータ・サービス・コンポーネントの場合は、サービス・コンポーネント・レベルで再順序付けを指定すると、すべての操作に同じ再順序付けルールが適用され、すべての操作に着信するメッセージが再順序付けされます。デフォルトの再順序レベルは操作です。
再順序レベルを指定する手順は、次のとおりです。
この項では、3つの異なるタイプの再順序付け戦略を構成する手順を示します。
「再順序付けレベルの指定方法」の説明に従って、再順序レベルを設定してください。
構成する各メディエータ・コンポーネントまたは操作のメディエータ・エディタで、「再順序モード」ドロップダウン・リストから「標準」を選択します。
図23-4 に示すように、「再順序オプション」ボックスが表示され、標準再シーケンサのオプションが含まれています。
表23-6 にリストされたフィールドに入力します。
注意:
「グループ」フィールドおよび「ID」フィールドに値を指定するには、各フィールドの右にある「式ビルダーの起動」ボタンをクリックしてください。これにより式ビルダーが起動し、フィールド式を作成したり関数を追加する際にグラフィカルなサポートが提供されます。
表23-6 標準の再順序付けオプション
フィールド名 | 説明 | デフォルト値 | 必須 |
---|---|---|---|
グループ |
グループ化が行われる着信メッセージのフィールドを指し示すXPath。 |
component_name-operation |
N |
ID |
再順序付けが行われる着信メッセージのフィールドを指し示すXPath。 |
なし |
Y |
タイムアウト |
予期されているメッセージを待機する期間(秒単位)。タイムアウトが発生すると、再シーケンサはグループをタイムアウトとしてロックします。 |
01 |
N |
開始 |
ID順序の開始番号。 |
1 |
N |
増分 |
ID順序の増分。 |
1 |
N |
「再順序付けレベルの指定方法」の説明に従って、再順序レベルを設定してください。
構成する各Oracle Mediatorコンポーネントまたは操作のメディエータ・エディタで、「再順序モード」ドロップダウン・リストから「FIFO」を選択します。
図23-5 に示すように、「再順序オプション」ボックスが表示され、標準再シーケンサのオプションが含まれています。
「グループ」フィールドで、グループ化が実行される着信メッセージのフィールドを指し示すXPath式を入力します。
「再順序付けレベルの指定方法」の説明に従って、再順序レベルを設定してください。
構成する各メディエータ・コンポーネントまたは操作のメディエータ・エディタで、「再順序モード」ドロップダウン・リストから「ベスト・エフォート」を選択します。
図23-6 に示すように、「再順序オプション」ボックスが表示され、標準再シーケンサのオプションが含まれています。
図23-6 「再順序モード」が「ベスト・エフォート」に設定されている状態のOracle Mediator
表23-7 にリストされているフィールドを入力して、ベスト・エフォート再シーケンサを構成します。
注意
メッセージの一度に処理する最大行数または時間ウィンドウのいずれかを指定できます。両方を指定することはできません。一方の制御を有効にするには、もう片方を0に設定する必要があります。
必要に応じて、バッファとして追加された時間ウィンドウの割合を変更できます。Oracle Enterprise Manager Fusion Middleware Controlを使用してバッファを構成します。
詳細は、『Oracle SOA SuiteおよびOracle Business Process Management Suiteの管理』の再順序付けされたメッセージの構成に関する項を参照してください。
表23-7 ベスト・エフォート再順序付けオプション
フィールド名 | 説明 | デフォルト値 | 必須 |
---|---|---|---|
グループ |
グループ化が実行される着信メッセージのフィールドを指し示すXPath。 |
component_name-operation |
N |
ID |
再順序付けが実行され、IDを含む着信メッセージのフィールドを指し示すXPath。 |
なし |
Y |
データ型 |
順序IDのデータ型。注文プロセスはデータ型に基づいています。サポートされる値は、日時または数値です。 |
数値 |
Y |
最大行数 |
再シーケンサが一度にデータ・ストアから取得する、順に従ったメッセージの数。 時間ウィンドウまたは最大行数を指定する必要がありますが、両方は指定できません。一方の制御を有効にするには、もう片方を0に設定する必要があります。 |
5 |
N |
時間ウィンドウ |
メッセージの着信後、再順序付けのためデータ・ストアからメッセージを選択するのに待機する時間の長さ(分単位)。 時間ウィンドウまたは最大行数を指定する必要がありますが、両方は指定できません。一方の制御を有効にするには、もう片方を0に設定する必要があります。 |
0 |
N |
このデフォルト値の場合、デフォルトではグループに対してタイムアウトが発生することはありません。