Oracle E-Business Suite からポーリング ベースのデータ変更メッセージを受信する
Microsoft BizTalk Adapter for Oracle E-Business Suite では、インターフェイス テーブル、インターフェイス ビュー、テーブル、ビューをポーリングして、ポーリング ベースのデータ変更メッセージを受信できます。 アダプターは、次の方法でアプリケーションにメッセージを配信します。
SQL SELECT クエリを実行して、データがポーリングに使用できるかどうかを判断します。 SQL SELECT クエリを定期的または継続的に実行するようにアダプターを構成できます。
Oracle テーブルまたはビューに対して SQL SELECT クエリを実行するか、ストアド プロシージャ、関数、またはパッケージ化されたプロシージャと関数を実行する。
Oracle E-Business Suite でオプションのポーリング後 PL/SQL コード ブロックを実行する。 このコード ブロックは、多くの場合、対象のクエリ対象レコードのフィールドを更新したり、クエリ対象のレコードを別のテーブルまたはビューに移動したりするために使用されます。
クエリを返すと、ポーリング操作として公開される POLL 操作、ストアド プロシージャ、関数、またはパッケージ化されたプロシージャおよび関数を呼び出すことによって、結果セットが生成されます。
アダプターは、Oracle トランザクション内でこれらすべての操作を実行します。
バインド プロパティを使用してデータ変更メッセージを受信するように Oracle E-Business Adapter を構成するにはどうすればよいですか?
データ変更メッセージを受信するように Oracle E-Business アダプターを構成するには、次のバインディング プロパティの一部またはすべてを設定します。
Binding プロパティ | 値 | 既定 | 必須/省略可能 |
---|---|---|---|
InboundOperationType | 値が [ポーリング] に設定されていることを確認します。 | ポーリング | 必須。 明示的に設定されていない場合は、既定値が適用されます。 |
PolledDataAvailableStatement | 実行される SELECT ステートメントを指定して、特定のテーブルのポーリングに使用できるデータがあるかどうかを判断します。 指定したステートメントは、行と列で構成される結果セットを返す必要があります。 結果セットの最初のセルの値は、アダプターが PollingInput バインド プロパティに指定された値を実行するかどうかを示します。 結果の最初のセルに正の値が含まれている場合、アダプターはポーリング ステートメントを実行します。 たとえば、このバインディング プロパティの有効なステートメントは次のようになります。Select * from <table_name> メモ: このバインディング プロパティにはストアド プロシージャを指定しないでください。 また、このステートメントでは、Oracle E-Business Suite または基になる Oracle データベースのデータを変更することはできません。 |
null | 必須。 |
PollingAction | ポーリング操作のアクションを指定します。 アダプター サービス アドインを使用して、操作に対して生成したメタデータから、特定の操作のポーリング アクションを決定できます。 | null | SELECT ステートメントを使用してテーブルとビューに対するポーリング操作の場合は省略可能です。 |
PollingInput | 次のいずれかを指定します。 - Oracle E-Business Suite に対して実行する必要がある SQL SELECT ステートメント。 このステートメントには、FOR UPDATE 句を含める必要があります。 FOR UPDATE 句の詳細については、このトピックで後述 するポーリング ステートメントの FOR UPDATE 句の指定 に関するページを参照してください。 - ポーリングするパッケージ内のストアド プロシージャ、関数、またはプロシージャまたは関数のメッセージを要求します。 |
null | 必須。 PollingInput を null 以外の値に設定すると、ポーリングが有効になります。 |
PollingInterval | アダプターが Oracle E-Business Suite に対してクエリを実行する間隔 (秒単位) に設定します。 このプロパティは、ポーリング間隔とポーリング トランザクションのタイムアウトを指定します。値は、Oracle E-Business Suite でクエリとポーリング後ステートメントを実行するのにかかる時間と、クライアントがクエリ データを処理してポーリング応答メッセージを返すのにかかる時間を超える必要があります。 | 30 | 必須。 明示的に設定されていない場合は、既定値が適用されます。 |
PollWhileDataFound | ポーリング対象のテーブルでデータが使用可能な場合に、Oracle E-Business アダプターがポーリング間隔を無視し、Oracle E-Business Suite を継続的にポーリングするかどうかを指定します。 テーブルで使用可能なデータがない場合、アダプターは、指定されたポーリング間隔で SQL ステートメントを実行するように戻します | False | 必須。 明示的に設定されていない場合は、既定値が適用されます。 |
PostPollStatement | クエリが実行された後、クエリ データがクライアントに返される前にアダプターによって実行されるオプションの PL/SQL コード ブロックに設定します。 | null | 省略可能。 値が指定されていない場合、post poll ステートメントは実行されません。 |
Note
WCF サービス モデルまたは WCF チャネル モデルを使用している場合は、 AcceptCredentialsInUri バインド プロパティも設定する必要があります。
ポーリング ステートメントでの FOR UPDATE 句の指定
SELECT ステートメントをポーリング ステートメントとして使用し、SELECT ステートメントで指定された行に影響するポーリング後ステートメントを実行する場合は、ポーリング ステートメントで FOR UPDATE 句を使用する必要があります。 FOR UPDATE 句を指定すると、ポーリング ステートメントによって選択されたレコードがトランザクション中にロックされ、ポーリング後ステートメントで必要な更新を実行できるようになります。
注意事項
ポーリングステートメントとポーリング後ステートメントの間の時間枠で、ポーリング後ステートメントの条件を満たすレコードがテーブルに追加されるシナリオを作成できます。 このような状況では、ポーリング後ステートメントは、ポーリング ステートメントの一部として選択されたレコードだけでなく、条件を満たすすべてのレコードを更新します。
ポーリング後ステートメントが指定され、ポーリング ステートメントに FOR UPDATE 句が含まれていない場合は、次の 2 つの条件のいずれかが発生します。
TransactionIsolationLevel が ReadCommitted に設定されている場合、ポーリング後のクエリでは、選択した行は更新されません。
TransactionIsolationLevel が Serializable に設定されている場合、ポーリング後のステートメントが実行されるときに、次のターゲット システム例外 (Microsoft.ServiceModel.Channels.Common.TargetSystemException) が発生します。"ORA-08177 では、このトランザクションのアクセスをシリアル化できません"。 このような場合は、アダプターが同じトランザクションを再試行する回数を定義するために 、PollingRetryCount バインド プロパティを設定する必要があります。
トランザクション分離レベルを設定する方法については、「 Oracle E-Business Suite でトランザクション分離レベルとトランザクション タイムアウトを構成する」を参照してください。
ポーリングステートメントとポーリング後ステートメントは、アダプター クライアントがトランザクションを使用するように構成されており、アダプターの UseAmbientTransaction バインディング プロパティの値が True に設定されている場合、トランザクションで実行されます。
FOR UPDATE オプションを使用したポーリング クエリの例を次に示します。
SELECT * from EMP WHERE FLAG = 'Y' FOR UPDATE
ポーリング ステートメントでの NOWAIT 句の指定
同時実行スレッドがポーリング対象のテーブルにアクセスし、テーブル内の競合が多すぎるシナリオが発生する可能性があります。 これにより、ポーリング クエリがブロックされ、テーブル行に対するロックが取得される可能性があります。 ポーリング ステートメントとして SELECT ステートメントを使用している場合は、SELECT ステートメントで FOR UPDATE キーワード (keyword)と共に NOWAIT キーワード (keyword)を指定できます。 これにより、ポーリング クエリが選択しようとしている行にロックがある場合、アダプター内のポーリング クエリの実行が直ちに返されます。 通常、このような条件下で Oracle によって例外がスローされます。 ここでも、アダプター クライアントは PollingInterval バインド プロパティを使用して、アダプター クライアントがデータのポーリングを再試行する必要がある時間間隔を指定できます。
NOWAIT オプションを使用したポーリング クエリの例を次に示します。
SELECT * from EMP WHERE FLAG = 'Y' FOR UPDATE NOWAIT
ポーリング ステートメントでの SKIP LOCKED 句の指定
ポーリング対象のテーブルにアクセスする同時スレッドが原因で、ポーリング クエリで指定された WHERE 句の結果セット内の一部の行がロックされるシナリオがあります。 たとえば、ポーリング クエリはテーブルから 6 行を返します。この 6 行のうち 4 行は、他のトランザクションのために既にロックされています。 この場合は、SKIP LOCKED キーワード (keyword)と FOR UPDATE キーワード (keyword)を指定して、WHERE 句で指定された行をロックし、既にロックされている行をスキップするようにデータベースに指示できます。 WHERE 句のロック解除された行はトランザクション中にロックされ、ポーリング後ステートメントは必要な更新を実行して、これらの行が再度ポーリングされないようにすることができます。 これにより、WHERE 句で指定されたすべての行がロック解除されるまで、ポーリング メッセージの受信を待機する必要はありません。
SKIP LOCKED キーワード (keyword)は、データベース内の同じテーブルをポーリングしている複数のコンピューターにアダプター クライアントがある場合に便利です。 ポーリング操作を構成して、その時点でロックが解除された WHERE 句で指定された行のポーリング ベースのデータ変更メッセージを受信するようにアダプター クライアント間で負荷分散を行い、その行を更新して、ポーリング ベースのデータ変更メッセージがアダプター クライアントによって受信された場合に確実に行を更新できます。 他のクライアントは同じメッセージを受け取りません。
SKIP LOCKED オプションを使用したポーリング クエリの例を次に示します。
SELECT * from EMP WHERE FLAG = 'Y' FOR UPDATE SKIP LOCKED
順序付き配信 (FIFO) のサポート
運用環境では、ポーリングを使用して Oracle E-Business Suite のデータ変更を監視できます。 これらのデータ変更メッセージは、Oracle E-Business アダプターを使用してアダプター クライアントによって受信されます。 ビジネス シナリオに基づいて、データ変更メッセージをアダプター クライアントが適切な順序で受信することが重要な場合があります。
Oracle E-Business アダプターは、Oracle E-Business Suite からメッセージを受信する順序を維持するために、順序指定された配信または先入れ先出し (FIFO) をサポートしています。 Oracle E-Business アダプターの受信シナリオでの FIFO のサポートに関連するいくつかの考慮事項を次に示します。
メッセージがオーケストレーションによって使用されている場合、オーケストレーションには、Oracle E-Business アダプターの受信ポートから送信されるメッセージの順序付けられた配信セットが必要です。
メッセージが送信ポート (コンテンツ ベースのルーティング) シナリオで使用されている場合、送信ポートには、Oracle E-Business アダプターの受信ポートから送信されるメッセージの順序付けされた配信セットが必要です。
WCF-Custom アダプターまたは WCF-OracleEBS アダプターには、受信処理に 失敗した要求メッセージを中断 するかどうかを指定する"失敗時に要求メッセージを中断する" プロパティがあります。 このプロパティは、WCF-Custom の [ メッセージ ] タブ、または [ エラー処理 ] セクションの WCF-OracleEBS 受信ポートで設定できます。 次の表は、このプロパティが設定されているかどうか、およびメッセージ サブスクライバー (オーケストレーションまたはポート) の状態に基づいて、受信メッセージがどのように処理されるかを説明するシナリオを示しています。
ポート プロパティ WCF-Custom | 登録されていない状態のサブスクライバー | 参加済みで停止状態のサブスクライバー |
---|---|---|
エラー プロパティ NOT が設定された場合に要求メッセージを中断する | - ルーティング エラー レポートが中断された (再開できないメッセージ) として生成される - 実際のメッセージが中断されない - トランザクションが中止されるため、ポーリング後のクエリは実行されません。 そのため、ポーリングは繰り返し行をフェッチします。 - 何が起こったかを説明するためにイベント ログで報告されたエラー。 |
- "Failure" とは見なされません。 イベント ログにエラー メッセージはありません。 - 実際のメッセージは、中断 (再開可能) キューに入れられます。 - サブスクライブしているポートまたはオーケストレーションが開始されると、メッセージが自動的に再開されます。 サブスクライバーで順序指定された配信が設定されている場合は、その配信が受け入れられます。 - メッセージは手動で再開することもできます。 |
エラー プロパティ IS セットでの要求メッセージの中断 | - ルーティング エラー レポートが中断された (再開できないメッセージ) として生成される - 実際のメッセージも中断されています - トランザクションが中止されるため、ポーリング後のクエリは実行されません。 そのため、ポーリングは繰り返し行をフェッチします。 - 何が起こったかを説明するためにイベント ログで報告されたエラー。 |
- "Failure" とは見なされません。 イベント ログにエラー メッセージはありません。 - 実際のメッセージは、中断 (再開可能) キューに入れられます。 - サブスクライブしているポートまたはオーケストレーションが開始されると、メッセージが自動的に再開されます。 サブスクライバーで順序指定された配信が設定されている場合は、その配信が受け入れられます。 - メッセージは手動で再開することもできます。 |
参照
開発アクティビティ
BizTalk Serverを使用して Oracle E-Business Suite をポーリングする