次の方法で共有


Oracle E-Business Suite からポーリング ベースのデータ変更メッセージを受信する

Oracle E-Business Suite 用の Microsoft BizTalk Adapter では、インターフェイステーブル、インターフェイスビュー、テーブル、ビューをポーリングすることで、ポーリングベースのメッセージとしてデータの変更を受信できます。 アダプターは、次の方法でアプリケーションにメッセージを配信します。

  • SQL SELECT クエリを実行して、データがポーリングに使用できるかどうかを判断します。 SQL SELECT クエリを定期的または継続的に実行するようにアダプターを構成できます。

  • Oracle テーブルまたはビューに対して SQL SELECT クエリを実行するか、ストアド プロシージャ、関数、またはパッケージ化されたプロシージャと関数を実行する。

  • Oracle E-Business Suite でオプションとしてポーリング後に実行される PL/SQL コードブロック。 このコード ブロックは、多くの場合、ターゲット内のクエリされたレコードのフィールドを更新したり、クエリされたレコードを別のテーブルまたはビューに移動したりするために使用されます。

  • ポーリング操作として公開されている POLL 操作、ストアド プロシージャ、関数、またはパッケージ化されたプロシージャおよび関数を呼び出して、クエリの結果を結果セットに返します。

    アダプターは、Oracle トランザクション内でこれらすべての操作を実行します。

バインド プロパティを使用してデータ変更メッセージを受信するように Oracle E-Business アダプターを構成するにはどうすればよいですか?

次のバインディング プロパティの一部またはすべてを設定して、データ変更メッセージを受信するように Oracle E-Business アダプターを構成します。

バインディングプロパティ 価値 既定値 必須/任意
InboundOperationType 値が [ポーリング] に設定されていることを確認します。 ポーリング 必須。 明示的に設定しない場合は、既定値が適用されます。
ポーリングデータの利用可能声明 実行される SELECT ステートメントを指定して、特定のテーブルのポーリングに使用できるデータがあるかどうかを判断します。 指定したステートメントは、行と列で構成される結果セットを返す必要があります。 結果セットの最初のセルの値は、アダプターが PollingInput バインディング プロパティに指定された値を実行するかどうかを示します。 結果の最初のセルに正の値が含まれている場合、アダプターはポーリング ステートメントを実行します。 たとえば、このバインド プロパティの有効なステートメントは次のようになります。

Select * from <table_name>

手記: このバインド プロパティにはストアド プロシージャを指定しないでください。 また、このステートメントでは、Oracle E-Business Suite または基になる Oracle データベースのデータを変更しないでください。
無効 必須。
PollingAction ポーリング操作のアクションを指定します。 アダプター サービス アドインを使用して、操作に対して生成したメタデータから、特定の操作のポーリング アクションを決定できます。 無効 SELECT ステートメントを使用してテーブルとビューに対するポーリング操作を行う場合は省略可能です。
PollingInput 次のいずれかを指定します。

- Oracle E-Business Suite に対して実行する必要がある SQL SELECT ステートメント。 このステートメントには、FOR UPDATE 句を含める必要があります。 FOR UPDATE 句の詳細については、このトピックで後述 するポーリング ステートメントでの FOR UPDATE 句の指定 を参照してください。

- ポーリング対象とするパッケージ内のストアドプロシージャ、関数、またはプロシージャまたは関数のリクエストメッセージ。
無効 必須。 PollingInput を null 以外の値に設定すると、ポーリングが有効になります。
PollingInterval アダプターが Oracle E-Business Suite に対してクエリを実行する間隔を秒単位で設定します。 このプロパティは、ポーリング間隔とポーリング トランザクションタイムアウトを指定します。値は、Oracle E-Business Suite でクエリと事後ポーリング ステートメントを実行するのにかかる時間 (指定されている場合) に加えて、クライアントがクエリ データを処理してポーリング応答メッセージを返すのにかかる時間を超える必要があります。 30 必須。 明示的に設定しない場合は、既定値が適用されます。
PollWhileDataFound Oracle E-Business アダプターがポーリング間隔を無視し、ポーリング対象のテーブルでデータが使用可能な場合に Oracle E-Business Suite を継続的にポーリングするかどうかを指定します。 テーブルに使用可能なデータがない場合、アダプターは指定されたポーリング間隔で SQL ステートメントを実行するように戻ります。 いいえ 必須。 明示的に設定しない場合は、既定値が適用されます。
投票後声明 クエリの実行後、クエリ データがクライアントに返される前にアダプターによって実行されるオプションの PL/SQL コード ブロックに設定します。 無効 任意。 値が指定されていない場合、post poll ステートメントは実行されません。

WCF サービス モデルまたは WCF チャネル モデルを使用している場合は、 AcceptCredentialsInUri バインディング プロパティも設定する必要があります。

ポーリング ステートメントでの FOR UPDATE 句の指定

ポーリング ステートメントとして SELECT ステートメントを使用し、SELECT ステートメントで指定された行に影響するポーリング後ステートメントを実行する場合は、ポーリング ステートメントで FOR UPDATE 句を使用する必要があります。 FOR UPDATE 句を指定すると、ポーリング ステートメントによって選択されたレコードがトランザクション中にロックされ、ポーリング後ステートメントで必要な更新を実行できるようになります。

注意事項

ポーリングステートメントとポーリング後ステートメントの間の時間枠内で、ポーリング後ステートメントの条件を満たすレコードがテーブルに追加されるシナリオを作成できます。 このような状況では、ポーリング後ステートメントは、ポーリング ステートメントの一部として選択されたレコードだけでなく、条件を満たすすべてのレコードを更新します。

ポーリング後ステートメントが指定されていて、ポーリング ステートメントに FOR UPDATE 句が含まれていない場合は、次の 2 つの条件のいずれかが発生します。

  • TransactionIsolationLevelReadCommitted に設定されている場合、ポーリング後のクエリでは、選択した行は更新されません。

  • TransactionIsolationLevelSerializable に設定されている場合、ポーリング後のステートメントの実行時に次のターゲット システム例外 (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 キーワードと共に NOWAIT キーワードを指定できます。 これにより、ポーリング クエリが選択しようとしている行に対するロックがある場合、アダプター内のポーリング クエリの実行が直ちに返されます。 通常、このような条件下で Oracle によって例外がスローされます。 ここでも、アダプター クライアントは PollingInterval バインディング プロパティを使用して、アダプター クライアントがデータのポーリングを再試行する必要がある時間間隔を指定できます。

NOWAIT オプションを使用したポーリング クエリの例を次に示します。

SELECT * from EMP WHERE FLAG = 'Y' FOR UPDATE NOWAIT  

ポーリング ステートメントでの SKIP LOCKED 句の指定

ポーリング対象のテーブルに同時スレッドがアクセスするため、ポーリング クエリで指定された WHERE 句の結果セット内の一部の行がロックされている場合があります。 たとえば、ポーリング クエリはテーブルから 6 行を返します。この 6 行のうち 4 行は、他のトランザクションのために既にロックされています。 この場合は、SKIP LOCKED キーワードと FOR UPDATE キーワードを指定して、WHERE 句で指定された行をロックし、既にロックされている行をスキップするようにデータベースに指示できます。 WHERE 句のロック解除された行はトランザクション中にロックされ、ポーリング後のステートメントで必要な更新を実行して、これらの行が再度ポーリングされないようにすることができます。 これにより、WHERE 句で指定されたすべての行がロック解除されるまで、ポーリング メッセージの受信を待機する必要がないようにします。

SKIP LOCKED キーワードは、データベース内の同じテーブルをポーリングしている複数のコンピューターにアダプター クライアントがある場合に便利です。 その時点でロックが解除された 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 一覧に登録されていない状態のサブスクライバー 参加済みでも停止状態のサブスクライバー
失敗した場合に要求メッセージを中断するプロパティが設定されていません - ルーティング エラー レポートが中断された (再開できないメッセージ) として生成される

- 実際のメッセージが中断されていない

- ポーリング後のクエリは、トランザクションが中止されるため実行されません。 そのため、ポーリングが繰り返され、行が再度フェッチされます。

- 発生した内容を説明するためにイベント ログで報告されたエラー。
- 「失敗」とは見なされない。 イベント ログにエラー メッセージはありません。

- 実際のメッセージは、中断された (再開可能な) キューに入れられます。

- サブスクライブポートまたはオーケストレーションが開始されると、メッセージは自動的に再開されます。 サブスクライバーに指定された配信がある場合は、その配信が優先されます。

- メッセージは手動で再開することもできます。
障害時に要求メッセージが中断されるプロパティが設定されています - ルーティング エラー レポートが中断された (再開できないメッセージ) として生成される

- 実際のメッセージも中断されます

- ポスト投票のクエリは、トランザクションが中止されるため、実行されません。 そのため、ポーリングが繰り返され、行が再度フェッチされます。

- 発生した内容を説明するためにイベント ログで報告されたエラー。
- 「失敗」とは見なされません。 イベント ログにエラー メッセージはありません。

- 実際のメッセージは、中断された (再開可能な) キューに入れられます。

- サブスクライブポートまたはオーケストレーションが開始されると、メッセージは自動的に再開されます。 契約者に対して指定された配信が設定されている場合は、その配信が尊重されます。

- メッセージは手動で再開することもできます。

こちらもご覧ください

開発アクティビティ
BizTalk Server を使用して Oracle E-Business Suite をポーリングする