次の方法で共有


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 アダプター バインド プロパティをまとめたものです。 ポーリング アプリケーションの実行中に、これらのバインド プロパティを指定する必要があります。

Binding プロパティ 説明
InboundOperationType ポーリングまたは通知の受信操作を実行するかどうかを指定します。 既定値は ポーリングです
PolledDataAvailableStatement ポーリングに使用できるデータがあるかどうかを判断するためにアダプターが実行する SQL ステートメントを指定します。 レコードが使用可能な場合にのみ、 PollingInput バインディング プロパティに指定した SELECT ステートメントが実行されます。
PollingInterval Oracle E-Business アダプターが PolledDataAvailableStatement バインディング プロパティに指定されたステートメントを実行する間隔を秒単位で指定します。 既定値は 30 秒です。 ポーリング間隔は、連続するポーリング間の時間間隔を決定します。 ステートメントが指定された期間内に実行された場合、アダプターはその間隔の残りの時間スリープ状態になります。
PollingInput ポーリング ステートメントを指定します。 SELECT ステートメントを使用してポーリングするには、このバインディング プロパティに SELECT ステートメントを指定する必要があります。 既定値は null です。

ポーリングを有効にするには、 PollingInput バインド プロパティの値を指定する必要があります。 ポーリング ステートメントは、ポーリングに使用できるデータがある場合にのみ実行されます。これは、 PolledDataAvailableStatement バインド プロパティによって決定されます。
PollingAction ポーリング操作のアクションを指定します。 操作用に生成されたサービス インターフェイスからポーリング アクションを確認するには、Add Adapter Service Reference Visual Studio Plug-in を使用します。
PostPollStatement 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
    

    Note

    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 インターフェイス テーブルに対する Poll 操作の 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 サービス コントラクト (インターフェイス)

次のコードは、インターフェイス テーブルに対する Poll 操作用に生成された WCF サービス コントラクト (インターフェイス) MS_SAMPLE_EMPLOYEE示しています。

[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);
}

メッセージ コントラクト

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

[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 で作成したバインディングを使用します。

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

    • コントラクトを "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. ポーリングを終了するには、サービス ホストを閉じます。

    重要

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

    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 をポーリングする