次の方法で共有


WCF サービス モデルで SELECT ステートメントを使用して Oracle E-Business Suite をポーリングする

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 スクリプトを実行します。 このスクリプトを実行すると、次のポーリング操作によって、テーブルに挿入された新しいレコードが取得されます。

WCF サービス モデルでのポーリングの構成

WCF サービス モデルで Oracle E-Business アダプターを使用してインターフェイス テーブルをポーリングするには、次の手順を実行する必要があります。

  • MS_SAMPLE_EMPLOYEE インターフェイス テーブルで ポーリング 操作用の WCF サービス コントラクト (インターフェイス) を生成します。 これを行うには、アダプター サービス参照の追加プラグインを使用できます。

  • このインターフェイスから WCF サービスを実装します。

  • サービス ホスト (System.ServiceModel.ServiceHost) を使用して、この WCF サービスをホストします。

このトピックで使用する例について

このトピックの例では、MS_SAMPLE_EMPLOYEE インターフェイス テーブルをポーリングします。 テーブルを生成するスクリプトがサンプルと共に提供されます。 サンプルの詳細については、 Oracle EBS アダプターのサンプルを参照してください。 このトピックに基づく サンプル SelectPolling_ServiceModelは、Oracle E-Business アダプターのサンプルでも提供されています。

WCF サービス コントラクトとクラス

アダプター サービス参照の追加プラグインを使用して、 ポーリング 操作の WCF サービス コントラクト (インターフェイス) とサポート クラスを作成できます。 WCF サービス コントラクトの生成の詳細については、「 Oracle E-Business Suite ソリューション成果物の WCF クライアントまたは WCF サービス コントラクトを生成する」を参照してください。

WCF サービス コントラクト (インターフェイス)

次のコードは、MS_SAMPLE_EMPLOYEE インターフェイステーブルのポーリング操作用に生成された WCF サービス契約 (インターフェース) を示しています。

[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")]
[System.ServiceModel.ServiceContractAttribute(Namespace="http://schemas.microsoft.com/OracleEBS/", ConfigurationName="InterfaceTables_FND_APPS_MS_SAMPLE_EMPLOYEE")]
public interface InterfaceTables_FND_APPS_MS_SAMPLE_EMPLOYEE {

    // CODEGEN: Generating message contract since the wrapper namespace (https://schemas.microsoft.com/OracleEBS/2008/05/InterfaceTables/FND/APPS/MS_SAMPLE_EMPLOYEE) of message Poll
    // does not match the default value (https://schemas.microsoft.com/OracleEBS/)
    [System.ServiceModel.OperationContractAttribute(IsOneWay=true, Action="InterfaceTables/Poll/FND/APPS/MS_SAMPLE_EMPLOYEE")]
    void Poll(Poll request);
}

メッセージ コントラクト

MS_SAMPLE_EMPLOYEE インターフェース テーブルの Poll 操作に対するメッセージ コントラクトです。

[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")]
[System.ServiceModel.MessageContractAttribute(WrapperName="Poll", WrapperNamespace="http://schemas.microsoft.com/OracleEBS/2008/05/InterfaceTables/FND/APPS/MS_SAMPLE" +
    "_EMPLOYEE", IsWrapped=true)]
public partial class Poll {

    [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://schemas.microsoft.com/OracleEBS/2008/05/InterfaceTables/FND/APPS/MS_SAMPLE" +
        "_EMPLOYEE", Order=0)]
    public schemas.microsoft.com.OracleEBS._2008._05.TableViewRecord.APPS.MS_SAMPLE_EMPLOYEE.SelectRecord[] DATA;

    public Poll() {
    }

    public Poll(schemas.microsoft.com.OracleEBS._2008._05.TableViewRecord.APPS.MS_SAMPLE_EMPLOYEE.SelectRecord[] DATA) {
        this.DATA = DATA;
    }
}

WCF サービス クラス

アダプター サービス参照の追加プラグインは、サービス コントラクト (インターフェイス) から実装された WCF サービス クラスのスタブを持つファイルも生成します。 ファイルの名前はOracleEBSBindingService.cs。 このクラスに 直接 Poll 操作を処理するロジックを挿入できます。 次のコードは、アダプター サービス参照プラグインの追加によって生成される WCF サービス クラスを示しています。

namespace OracleEBSBindingNamespace {

    public class OracleEBSBindingService : InterfaceTables_FND_APPS_MS_SAMPLE_EMPLOYEE {

        // CODEGEN: Generating message contract since the wrapper namespace (https://schemas.microsoft.com/OracleEBS/2008/05/InterfaceTables/FND/APPS/MS_SAMPLE_EMPLOYEE) of message Poll
        // does not match the default value (https://schemas.microsoft.com/OracleEBS/)
        public virtual void Poll(Poll request) {
            throw new System.NotImplementedException("The method or operation is not implemented.");
        }
    }
}

SELECT ステートメントを使用するポーリング操作での着信メッセージの受信

このセクションでは、Oracle E-Business アダプターを使用して受信ポーリング メッセージを受信する .NET アプリケーションを記述する方法について説明します。

SELECT ステートメントを使用してポーリング メッセージを受信するには

  1. アダプター サービス参照の追加プラグインを使用して、MS_SAMPLE_EMPLOYEE インターフェイス テーブルに対する ポーリング 操作の WCF サービス コントラクト (インターフェイス) とヘルパー クラスを生成します。 詳細については、「 Oracle E-Business Suite ソリューション成果物の WCF クライアントまたは WCF サービス コントラクトを生成する」を参照してください。 必要に応じて、サービス コントラクトとヘルパー クラスの生成中にバインディング プロパティを指定できます。 これにより、生成された構成ファイルに正しく設定されます。

  2. 手順 1 で生成されたインターフェイスとヘルパー クラスから WCF サービスを実装します。 このクラスの Poll メソッドは、 ポーリング 操作から受信したデータの処理でエラーが発生した場合に、ポーリング トランザクションを中止する例外をスローできます。それ以外の場合、メソッドは何も返しません。 WCF サービス クラスの属性を次に示す必要があります。

    [ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
    

    Poll メソッド内では、アプリケーション ロジックを直接実装できます。 このクラスは、OracleEBSBindingService.csにあります。 この例のこのコードは、 OracleEBSBindingService クラスを サブクラス化します。 このコードでは、ポーリング メッセージが受信され、コンソールに書き込まれます。

    [ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
    
    public class PollingService : OracleEBSBindingNamespace.OracleEBSBindingService
    {
        public override void Poll(Poll request)
        {
            Console.WriteLine("\nNew Polling Records Received");
            Console.WriteLine("*************************************************");
            Console.WriteLine("Emp No\tName\tDesignation\tSalary");
            for (int i = 0; i < request.DATA.Length; i++)
            {
                Console.WriteLine("{0}\t{1}\t{2}\t{3}",
                request.DATA[i].EMP_NO,
                request.DATA[i].NAME,
                request.DATA[i].DESIGNATION,
                request.DATA[i].SALARY);
            }
            Console.WriteLine("*************************************************");
            Console.WriteLine("\nHit <RETURN> to stop polling");
        }
    }
    
  3. URI の一部として資格情報を渡さないようにするには、次のクラスを実装する必要があります。 アプリケーションの後半では、このクラスをインスタンス化して資格情報を渡します。

    class PollingCredentials : ClientCredentials, IServiceBehavior
    {
        public void AddBindingParameters(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase, Collection<ServiceEndpoint> endpoints, BindingParameterCollection bindingParameters)
        {
            bindingParameters.Add(this);
        }
    
        public void ApplyDispatchBehavior(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
        { }
    
        public void Validate(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
        { }
    
        protected override ClientCredentials CloneCore()
        {
            ClientCredentials clone = new PollingCredentials();
            clone.UserName.UserName = this.UserName.UserName;
            clone.UserName.Password = this.UserName.Password;
            return clone;
        }
    }
    
  4. OracleEBSBinding を作成し、バインド プロパティを指定してポーリング操作を構成します。 これは、コードで明示的に行うか、構成で宣言によって行うことができます。 少なくとも、 InboundOperationTypePolledDataAvailableStatementPollingInput、および 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";
    
  5. インターフェイス テーブルをポーリングするため、アプリケーション コンテキストも設定する必要があります。 アプリケーション コンテキストと、アプリケーション コンテキストの設定に必要なバインド プロパティの詳細については、「 アプリケーション コンテキストの設定」を参照してください。

    binding.OracleUserName = "myOracleEBSUserName";
    binding.OraclePassword = "myOracleEBSPassword";
    binding.OracleEBSResponsibilityName = "myOracleEBSResponsibility";
    
  6. 手順 3 で作成 した PollingCredentials クラスをインスタンス化して、Oracle E-Business Suite の資格情報を指定します。

    PollingCredentials credentials = new PollingCredentials();
    credentials.UserName.UserName = "<Enter user name here>";
    credentials.UserName.Password = "<Enter password here>";
    
  7. 手順 2 で作成した WCF サービスのインスタンスを作成します。

    // create service instance
    PollingService service = new PollingService();
    
  8. WCF サービスとベース接続 URI を使用して 、System.ServiceModel.ServiceHost のインスタンスを作成します。 基本接続 URI に受信 ID を含めることはできません (指定されている場合)。 ここでも資格情報を渡す必要があります。

    // Enable service host
    Uri[] baseUri = new Uri[] { new Uri("oracleebs://ebs_instance_name") };
    ServiceHost serviceHost = new ServiceHost(service, baseUri);
    serviceHost.Description.Behaviors.Add(credentials);
    
    
  9. サービス ホストにサービス エンドポイントを追加します。 これを行うには:

    • 手順 4 で作成したバインディングを使用します。

    • 資格情報を含む接続 URI と、必要に応じて受信 ID を指定します。

    • コントラクトを "InterfaceTables_FND_APPS_MS_SAMPLE_EMPLOYEE" として指定して、MS_SAMPLE_EMPLOYEE インターフェイス テーブルをポーリングします。

      // Add service endpoint: be sure to specify InterfaceTables_FND_APPS_MS_SAMPLE_EMPLOYEE as the contract
      Uri ConnectionUri = new Uri("oracleebs://ebs_instance_name");
      serviceHost.AddServiceEndpoint("InterfaceTables_FND_APPS_MS_SAMPLE_EMPLOYEE", binding, ConnectionUri);
      
  10. ポーリング データを受信するには、サービス ホストを開きます。 アダプターは、クエリが結果セットを返すたびにデータを返します。

    // Open the service host to begin polling
    serviceHost.Open();
    
  11. ポーリングを終了するには、サービス ホストを閉じます。

    Von Bedeutung

    アダプターは、サービス ホストが閉じられるまでポーリングを続行します。

    serviceHost.Close();
    

次の例は、MS_SAMPLE_EMPLOYEE インターフェイス テーブルをポーリングするポーリング アプリケーションを示しています。 PollingInput プロパティには、MS_SAMPLE_EMPLOYEE テーブルからすべてのデータを読み取る select ステートメントが含まれており、post poll ステートメントは同じテーブルからすべてのデータを削除します。 最初のポーリング メッセージは、MS_SAMPLE_EMPLOYEE インターフェイス テーブルのすべてのレコードを提供します。 後続のポーリング メッセージにはレコードは含まれません。これは、post poll ステートメントによってレコードが削除されるためです。 MS_SAMPLE_EMPLOYEE インターフェイス テーブルにさらにデータが追加されるまで、ポーリング メッセージは取得されません。 そのため、MS_SAMPLE_EMPLOYEE インターフェイス テーブルに新しいレコードを再入力する必要があります。 これを行うには、サンプルで提供されているinsert_apps_data.sql スクリプトを実行します。 このスクリプトを実行すると、次のポーリング操作によって、テーブルに挿入された新しいレコードが取得されます。 アダプターは、 <RETURN>を押してサービス ホストを閉じるまでポーリングを続行します。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Adapters.OracleEBS;
using Microsoft.ServiceModel.Channels;
using System.ServiceModel;
using System.ServiceModel.Description;
using System.ServiceModel.Channels;
using System.Collections.ObjectModel;

namespace SelectPolling_ServiceModel
{
    [ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]

    public class PollingService : OracleEBSBindingNamespace.OracleEBSBindingService
    {
        public override void Poll(Poll request)
        {
            Console.WriteLine("\nNew Polling Records Received");
            Console.WriteLine("*************************************************");
            Console.WriteLine("Emp No\tName\tDesignation\tSalary");
            for (int i = 0; i < request.DATA.Length; i++)
            {
                Console.WriteLine("{0}\t{1}\t{2}\t{3}",
                request.DATA[i].EMP_NO,
                request.DATA[i].NAME,
                request.DATA[i].DESIGNATION,
                request.DATA[i].SALARY);
            }
            Console.WriteLine("*************************************************");
            Console.WriteLine("\nHit <RETURN> to stop polling");
        }
    }

    class PollingCredentials : ClientCredentials, IServiceBehavior
    {
        public void AddBindingParameters(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase, Collection<ServiceEndpoint> endpoints, BindingParameterCollection bindingParameters)
        {
            bindingParameters.Add(this);
        }

        public void ApplyDispatchBehavior(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
        { }

        public void Validate(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
        { }

        protected override ClientCredentials CloneCore()
        {
            ClientCredentials clone = new PollingCredentials();
            clone.UserName.UserName = this.UserName.UserName;
            clone.UserName.Password = this.UserName.Password;
            return clone;
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            ServiceHost serviceHost = null;
            try
            {
                Console.WriteLine("Sample started...");
                Console.WriteLine("Press any key to start polling...");
                Console.ReadLine();

                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 = "myOracleEBSUserName";
                binding.OraclePassword = "myOracleEBSPassword";
                binding.OracleEBSResponsibilityName = "myOracleEBSResponsibility";

                // This URI is used to specify the address for the ServiceEndpoint
                // It must contain the InboundId that was used to generate
                // the WCF service callback interface
                Uri ConnectionUri = new Uri("oracleebs://ebs_instance_name");

                // This URI is used to initialize the ServiceHost. It cannot contain
                // an InboundID; otherwise,an exception is thrown when
                // the ServiceHost is initialized.
                Uri[] baseUri = new Uri[] { new Uri("oracleebs://ebs_instance_name") };

                PollingCredentials credentials = new PollingCredentials();
                credentials.UserName.UserName = "<Enter user name here>";
                credentials.UserName.Password = "<Enter password here>";

                Console.WriteLine("Opening service host...");
                PollingService service = new PollingService();
                serviceHost = new ServiceHost(service, baseUri);
                serviceHost.Description.Behaviors.Add(credentials);
                serviceHost.AddServiceEndpoint("InterfaceTables_FND_APPS_MS_SAMPLE_EMPLOYEE", binding, ConnectionUri);
                serviceHost.Open();
                Console.WriteLine("Service host opened...");
                Console.WriteLine("Polling started...");
                Console.ReadLine();
            }
            catch (Exception e)
            {
                Console.WriteLine("Exception :" + e.Message);
                Console.ReadLine();

                /* If there is an error it will be specified in the inner exception */
                if (e.InnerException != null)
                {
                    Console.WriteLine("InnerException: " + e.InnerException.Message);
                    Console.ReadLine();
                }
            }
            finally
            {
                // IMPORTANT: you must close the ServiceHost to stop polling
                if (serviceHost.State == CommunicationState.Opened)
                    serviceHost.Close();
                else
                    serviceHost.Abort();
            }
        }
    }
}

こちらもご覧ください

WCF サービス モデルを使用して Oracle E-Business Suite をポーリングする