SELECT ステートメントを使用して Oracle E-Business Suite のインターフェイス テーブル、インターフェイス ビュー、テーブル、ビューを継続的にポーリングすることで、定期的なデータ変更メッセージを受信するように Oracle E-Business アダプターを構成できます。 SELECT ステートメントは、Oracle E-Business Suite をポーリングするためにアダプターが定期的に実行するポーリング ステートメントとして指定できます。 ポーリング後の PL/SQL コード ブロックを指定して、ポーリング ステートメントの実行後にアダプターを実行することもできます。
ポーリングを有効にするには、このトピックの説明に従って特定のバインド プロパティを指定する必要があります。 アダプターがポーリングをサポートする方法の詳細については、「 ポーリングを使用した受信呼び出しのサポート」を参照してください。
Oracle E-Business Suite アダプターバインディングプロパティを使ったポーリング操作の設定
次の表は、データ変更メッセージを受信するようにアダプターを構成するために使用する Oracle E-Business アダプターのバインド プロパティをまとめたものです。 ポーリング アプリケーションの実行中に、これらのバインド プロパティを指定する必要があります。
バインディングプロパティ | 説明 |
---|---|
InboundOperationType | ポーリングまたは通知の受信操作を実行するかどうかを指定します。 既定値は ポーリングです。 |
ポーリングデータの利用可能声明 | ポーリングに使用できるデータがあるかどうかを判断するためにアダプターが実行する SQL ステートメントを指定します。 レコードが使用可能な場合にのみ、 PollingInput バインディング プロパティに指定した SELECT ステートメントが実行されます。 |
PollingInterval | Oracle E-Business アダプターが PolledDataAvailableStatement バインディング プロパティに指定されたステートメントを実行する間隔を秒単位で指定します。 既定値は 30 秒です。 ポーリング間隔は、連続するポーリング間の時間間隔を決定します。 ステートメントが指定された期間内に実行された場合、アダプターはその間隔の残りの時間スリープ状態になります。 |
PollingInput | ポーリング ステートメントを指定します。 SELECT ステートメントを使用してポーリングするには、このバインド プロパティに SELECT ステートメントを指定する必要があります。 既定値は null です。 ポーリングを有効にするには、 PollingInput バインド プロパティの値を指定する必要があります。 ポーリング ステートメントは、 PolledDataAvailableStatement バインディング プロパティによって決定されるポーリングに使用できるデータがある場合にのみ実行されます。 |
PollingAction | ポーリング操作のアクションを指定します。 操作用に生成されたサービス インターフェイスからポーリングアクションを決定するには、「アダプター サービス参照の追加」Visual Studioプラグインを使用します。 |
投票後声明 | PollingInput バインディング プロパティで指定されたステートメントが実行された後に実行されるステートメント ブロックを指定します。 |
PollWhileDataFound | ポーリング対象のテーブルでデータが使用可能な場合に、Oracle E-Business アダプターがポーリング間隔を無視し、ポーリング ステートメントを継続的に実行するかどうかを指定します。 テーブルにデータが存在しない場合、アダプターは、指定されたポーリング間隔でポーリング ステートメントを実行するように戻ります。 既定値は false です。 |
これらのプロパティの詳細については、「 BizTalk Adapter for Oracle E-Business Suite バインディング プロパティの読み取り」を参照してください。 Oracle E-Business アダプターを使用して Oracle データベースをポーリングする方法の詳細については、このトピックの残りの部分を参照してください。
このトピックがポーリングを説明する方法
このトピックでは、Oracle E-Business アダプターが SELECT ステートメントを使用したデータ変更メッセージの受信をサポートする方法を示すために、アプリケーション オブジェクト ライブラリ アプリケーションの MS_SAMPLE_EMPLOYEE インターフェイス テーブルをポーリングします。 このテーブルは、サンプルで提供されているcreate_apps_artifacts.sql スクリプトを実行して、Oracle E-Business Suite でこれらのオブジェクトを作成するときに作成されます。
ポーリング操作を示すために、次の操作を行います。
PolledDataAvailableStatement バインディング プロパティの SELECT ステートメントを指定して、ポーリング対象のインターフェイス テーブル (MS_SAMPLE_EMPLOYEE) にデータが含まれている場所を判断します。 この例では、このバインド プロパティを次のように設定できます。
SELECT COUNT (*) FROM MS_SAMPLE_EMPLOYEE
これにより、MS_SAMPLE_EMPLOYEE インターフェイス テーブルに一部のレコードがある場合にのみ、アダプターがポーリング ステートメントを実行します。
PollingInput バインディング プロパティの SELECT ステートメントを指定します。 このステートメントは、MS_SAMPLE_EMPLOYEE インターフェイス テーブル内のすべての行を取得します。 この例では、このバインド プロパティを次のように設定できます。
SELECT * FROM MS_SAMPLE_EMPLOYEE FOR UPDATE
注
SELECT ステートメントで使用される FOR UPDATE 句の詳細については、「 Oracle E-Business Suite からポーリング ベースのデータ変更メッセージを受信する」を参照してください。
PostPollStatement バインド プロパティの一部として DELETE ステートメントを指定します。 この文は、MS_SAMPLE_EMPLOYEEインターフェーステーブルからすべてのデータを削除します。 この例では、このバインド プロパティを次のように設定できます。
DELETE FROM MS_SAMPLE_EMPLOYEE
この処理が行われると、PollingInput に指定された次のステートメントが実行されると、データは取得されません。
MS_SAMPLE_EMPLOYEE インターフェイス テーブルにさらにデータが追加されるまで、ポーリング メッセージは取得されないため、MS_SAMPLE_EMPLOYEE インターフェイス テーブルに新しいレコードを再入力する必要があります。 これを行うには、サンプルで提供されているinsert_apps_data.sql スクリプトを実行します。 このスクリプトを実行すると、次のポーリング操作によって、テーブルに挿入された新しいレコードが取得されます。
ポーリング要求メッセージの処理
アダプターは、あなたのコードに対してポーリング操作を実行し、Oracle E-Business Suite をポーリングします。 つまり、アダプターは、IInputChannel チャネル図形を介して受信したポーリング要求メッセージを送信します。 ポーリング要求メッセージには、 PollingInput バインディング プロパティで指定されたクエリの結果セットが含まれています。 ポーリング メッセージは、次の 2 つの方法のいずれかで使用できます。
ノード値ストリーミングを使用してメッセージを使用するには、応答メッセージで WriteBodyContents メソッドを呼び出し、ノード値ストリーミングを実装する XmlDictionaryWriter を渡す必要があります。
ノード ストリーミングを使用してメッセージを使用するには、応答メッセージで GetReaderAtBodyContents を呼び出して XmlReader を取得します。
このトピックで使用する例について
このトピックの例では、MS_SAMPLE_EMPLOYEE インターフェイス テーブルをポーリングします。 テーブルを生成するスクリプトがサンプルと共に提供されます。 サンプルの詳細については、 Oracle EBS アダプターのサンプルを参照してください。 このトピックに基づく サンプル SelectPolling_ChannelModelは、Oracle E-Business アダプターのサンプルでも提供されています。
WCF チャネル モデルを使用したポーリング操作用の受信メッセージの受信
このセクションでは、Oracle E-Business アダプターを使用して受信ポーリング メッセージを受信する .NET アプリケーション (チャネル モデル) を記述する方法について説明します。
アダプターからポーリング メッセージを受信するには
Visual Studio で Microsoft Visual C# ® プロジェクトを作成します。 このトピックでは、コンソール アプリケーションを作成します。
ソリューション エクスプローラーで、
Microsoft.Adapters.OracleEBS
、Microsoft.ServiceModel.Channels
、System.ServiceModel
、およびSystem.Runtime.Serialization
への参照を追加します。Program.cs ファイルを開き、次の名前空間を追加します。
Microsoft.Adapters.OracleEBS
System.ServiceModel
System.ServiceModel.Description
System.ServiceModel.Channels
System.Xml
接続 URI を指定します。 アダプター接続 URI の詳細については、「 Oracle E-Business Suite 接続 URI の作成」を参照してください。
Uri ConnectionUri = new Uri("oracleebs://ebs_instance_name");
OracleEBSBinding のインスタンスを作成し、ポーリングを構成するために必要なバインディング プロパティを設定します。 少なくとも、 InboundOperationType、 PolledDataAvailableStatement、 PollingInput、および PollingAction バインディング プロパティを設定する必要があります。 ポーリングの構成に使用されるバインディング プロパティの詳細については、「ポーリングを 使用した受信呼び出しのサポート」を参照してください。
OracleEBSBinding binding = new OracleEBSBinding(); binding.InboundOperationType = InboundOperation.Polling; binding.PolledDataAvailableStatement = "SELECT COUNT (*) FROM MS_SAMPLE_EMPLOYEE"; binding.PollingInput = "SELECT * FROM MS_SAMPLE_EMPLOYEE FOR UPDATE"; binding.PollingAction = "InterfaceTables/Poll/FND/APPS/MS_SAMPLE_EMPLOYEE"; binding.PostPollStatement = "DELETE FROM MS_SAMPLE_EMPLOYEE";
インターフェイス テーブルをポーリングするため、アプリケーション コンテキストも設定する必要があります。 アプリケーション コンテキストの設定に必要なアプリケーション コンテキストとバインド プロパティの詳細については、「 アプリケーション コンテキストの設定」を参照してください。
binding.OracleUserName = "<Enter user name here>"; binding.OraclePassword = "<Enter password here>"; binding.OracleEBSResponsibilityName = "<Enter responsibility here>";
バインド パラメーター コレクションを作成し、資格情報を設定します。
ClientCredentials credentials = new ClientCredentials(); credentials.UserName.UserName = "<Enter user name here>"; credentials.UserName.Password = "<Enter password here>"; BindingParameterCollection bindingParams = new BindingParameterCollection(); bindingParams.Add(credentials);
チャネル リスナーを作成して開きます。 リスナーを作成する場合は、OracleEBSBinding で BuildChannelListener<IInputChannel> メソッドを呼び出します。
IChannelListener<IInputChannel> listener = binding.BuildChannelListener<IInputChannel>(connectionUri, bindingParams); listener.Open();
リスナーで AcceptChannel メソッドを呼び出して IInputChannel チャネルを取得し、開きます。
IInputChannel channel = listener.AcceptChannel(); channel.Open();
チャネルで Receive を呼び出して、アダプターから次の受信メッセージを取得します。
Message message = channel.Receive();
受信操作によって返される結果セットを処理します。 XmlReader または XmlDictionaryWriter を使用してメッセージを使用できます。
XmlReader reader = message.GetReaderAtBodyContents();
要求の処理が完了したら、チャネルを閉じます。
channel.Close()
Von Bedeutung
受信操作の処理が完了したら、チャネルを閉じる必要があります。 チャネルを閉じできないと、コードの動作に影響する可能性があります。
データ変更メッセージの受信が完了したら、リスナーを閉じます。
listener.Close()
Von Bedeutung
リスナーを閉じても、リスナーを使用して作成されたチャネルは閉じません。 リスナーを使用して作成された各チャネルを明示的に閉じる必要があります。
例
次の例は、MS_SAMPLE_EMPLOYEE インターフェイス テーブルをポーリングするポーリング アプリケーションを示しています。
PollingInput プロパティには、MS_SAMPLE_EMPLOYEE テーブルからすべてのデータを読み取る select ステートメントが含まれており、post poll ステートメントは同じテーブルからすべてのデータを削除します。 ポーリング メッセージは、 C:\PollingOutput.xml
に書き込まれます。
後続のポーリング メッセージには、MS_SAMPLE_EMPLOYEE インターフェイス テーブルにさらにデータが追加されるまで、レコードは含まれません。 これを行うには、サンプルで提供されているinsert_apps_data.sql スクリプトを実行します。 このスクリプトを実行すると、次のポーリング操作によって、テーブルに挿入された新しいレコードが取得されます。 アダプターは、 <RETURN> を押してサービス ホストを閉じるまでポーリングを続行します。
using System;
using Microsoft.Adapters.OracleEBS;
using System.ServiceModel;
using System.ServiceModel.Description;
using System.ServiceModel.Channels;
using System.Xml;
namespace SelectPolling_ChannelModel
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Sample started. This sample will poll 5 times and will perform the following tasks:");
Console.WriteLine("Press any key to start polling...");
Console.ReadLine();
IChannelListener<IInputChannel> listener = null;
IInputChannel channel = null;
try
{
TimeSpan messageTimeout = new TimeSpan(0, 0, 30);
OracleEBSBinding binding = new OracleEBSBinding();
binding.InboundOperationType = InboundOperation.Polling;
binding.PolledDataAvailableStatement = "SELECT COUNT (*) FROM MS_SAMPLE_EMPLOYEE";
binding.PollingInput = "SELECT * FROM MS_SAMPLE_EMPLOYEE FOR UPDATE";
binding.PollingAction = "InterfaceTables/Poll/FND/APPS/MS_SAMPLE_EMPLOYEE";
binding.PostPollStatement = "DELETE FROM MS_SAMPLE_EMPLOYEE";
binding.OracleUserName = "<Enter user name here>";
binding.OraclePassword = "<Enter password here>";
binding.OracleEBSResponsibilityName = "<Enter responsibility here>";
Uri ConnectionUri = new Uri("oracleebs://ebs_instance_name?");
ClientCredentials credentials = new ClientCredentials();
credentials.UserName.UserName = "<Enter user name here>";
credentials.UserName.Password = "<Enter password here>";
BindingParameterCollection bindingParams = new BindingParameterCollection();
bindingParams.Add(credentials);
listener = binding.BuildChannelListener<IInputChannel>(ConnectionUri, bindingParams);
listener.Open();
channel = listener.AcceptChannel();
channel.Open();
Console.WriteLine("Channel and Listener opened...");
Console.WriteLine("\nWaiting for polled data...");
Console.WriteLine("Receive request timeout is {0}", messageTimeout);
// Poll five times with the specified message timeout
// If a timeout occurs polling will be aborted
for (int i = 0; i < 5; i++)
{
Console.WriteLine("Polling: " + i);
Message message = null;
XmlReader reader = null;
try
{
//Message is received so process the results
message = channel.Receive(messageTimeout);
}
catch (System.TimeoutException toEx)
{
Console.WriteLine("\nNo data for request number {0}: {1}", i + 1, toEx.Message);
continue;
}
// Get the query results using an XML reader
try
{
reader = message.GetReaderAtBodyContents();
}
catch (Exception ex)
{
Console.WriteLine("Exception :" + ex);
throw;
}
XmlDocument doc = new XmlDocument();
doc.Load(reader);
using (XmlWriter writer = XmlWriter.Create("C:\\PollingOutput.xml"))
{
doc.WriteTo(writer);
Console.WriteLine("The polling response is saved at 'C:\\PollingOutput.xml'");
}
// return the cursor
Console.WriteLine();
// close the reader
reader.Close();
message.Close();
}
Console.WriteLine("\nPolling done -- hit <RETURN> to finish");
Console.ReadLine();
}
catch (Exception ex)
{
Console.WriteLine("Exception is: " + ex.Message);
Console.ReadLine();
if (ex.InnerException != null)
{
Console.WriteLine("Inner Exception is: " + ex.InnerException.Message);
Console.ReadLine();
}
}
finally
{
// IMPORTANT: close the channel and listener to stop polling
if (channel != null)
{
if (channel.State == CommunicationState.Opened)
channel.Close();
else
channel.Abort();
}
if (listener != null)
{
if (listener.State == CommunicationState.Opened)
listener.Close();
else
listener.Abort();
}
}
}
}
}