Condividi tramite


Eseguire il polling di Oracle E-Business Suite usando l'istruzione SELECT con il modello di servizio WCF

È possibile configurare l'adapter Oracle E-Business per ricevere messaggi periodici di modifica dei dati usando un'istruzione SELECT per eseguire continuamente il polling delle tabelle dell'interfaccia, delle visualizzazioni dell'interfaccia, delle tabelle e delle viste in Oracle E-Business Suite. È possibile specificare un'istruzione SELECT come istruzione di polling eseguita periodicamente dall'adapter per eseguire il polling di Oracle E-Business Suite. È anche possibile specificare un blocco di codice PL/SQL post-poll eseguito dall'adapter dopo l'esecuzione dell'istruzione di polling.

Per abilitare il polling, è necessario specificare determinate proprietà di associazione, come descritto in questo argomento. Per altre informazioni su come l'adapter supporta il polling, vedere Supporto per le chiamate in ingresso usando il polling.

Configurazione di un'operazione di polling con le proprietà di associazione dell'adapter Oracle E-Business Suite

Nella tabella seguente vengono riepilogate le proprietà di associazione dell'adapter Oracle E-Business usate per configurare l'adapter per ricevere messaggi di modifica dei dati. È necessario specificare queste proprietà di associazione durante l'esecuzione dell'applicazione di polling.

Binding, proprietà Descrizione
InboundOperationType Specifica se si vuole eseguire l'operazione polling o notifica in ingresso. Il valore predefinito è Polling.
PolledDataAvailableStatement Specifica l'istruzione SQL eseguita dall'adapter per determinare se i dati sono disponibili per il polling. Solo se è disponibile un record, verrà eseguita l'istruzione SELECT specificata per la proprietà di associazione PollingInput .
PollingInterval Specifica l'intervallo, in secondi, in cui l'adapter Oracle E-Business esegue l'istruzione specificata per la proprietà di associazione PolledDataAvailableStatement . Il valore predefinito è 30 secondi. L'intervallo di polling determina l'intervallo di tempo tra i polling successivi. Se l'istruzione viene eseguita all'interno dell'intervallo specificato, l'adapter dorme per il tempo rimanente nell'intervallo.
PollingInput Specifica l'istruzione di polling. Per eseguire il polling usando un'istruzione SELECT, è necessario specificare un'istruzione SELECT per questa proprietà di associazione. Il valore predefinito è Null.

È necessario specificare un valore per la proprietà di associazione PollingInput per abilitare il polling. L'istruzione polling viene eseguita solo se sono disponibili dati per il polling, che viene determinato dalla proprietà di associazione PolledDataAvailableStatement .
PollingAction Specifica l'azione per l'operazione di polling. È possibile determinare l'azione di polling dall'interfaccia del servizio generata per l'operazione usando il plug-in Add Adapter Service Reference Visual Studio.
PostPollStatement Specifica un blocco di istruzioni eseguito dopo l'istruzione specificata dalla proprietà di associazione PollingInput .
PollWhileDataFound Specifica se l'adapter Oracle E-Business ignora l'intervallo di polling ed esegue continuamente l'istruzione di polling, se i dati sono disponibili nella tabella in cui viene eseguito il polling. Se nella tabella non sono disponibili dati, l'adapter esegue l'istruzione di polling all'intervallo di polling specificato. L'impostazione predefinita è false.

Per una descrizione più completa di queste proprietà, vedere Informazioni sulle proprietà di associazione BizTalk Adapter for Oracle E-Business Suite. Per una descrizione completa di come usare l'adapter Oracle E-Business per eseguire il polling del database Oracle, leggere altre informazioni.

Come viene illustrato il polling di questo argomento

In questo argomento viene illustrato come l'adapter Oracle E-Business supporta la ricezione di messaggi di modifica dei dati usando istruzioni SELECT, eseguire il polling della tabella dell'interfaccia MS_SAMPLE_EMPLOYEE nell'applicazione Application Object Library . Questa tabella viene creata quando si esegue lo script create_apps_artifacts.sql fornito con gli esempi per creare questi oggetti in Oracle E-Business Suite.

Per illustrare un'operazione di polling, eseguire le operazioni seguenti:

  • Specificare un'istruzione SELECT per la proprietà di associazione PolledDataAvailableStatement per determinare dove viene eseguito il polling della tabella dell'interfaccia (MS_SAMPLE_EMPLOYEE). In questo esempio è possibile impostare questa proprietà di associazione come:

    SELECT COUNT (*) FROM MS_SAMPLE_EMPLOYEE
    

    Ciò garantisce che l'adapter esegua l'istruzione di polling solo quando la tabella dell'interfaccia MS_SAMPLE_EMPLOYEE contiene alcuni record.

  • Specificare un'istruzione SELECT per la proprietà di associazione PollingInput . Questa istruzione recupera tutte le righe nella tabella dell'interfaccia MS_SAMPLE_EMPLOYEE. In questo esempio è possibile impostare questa proprietà di associazione come:

    SELECT * FROM MS_SAMPLE_EMPLOYEE FOR UPDATE
    

    Nota

    Per informazioni sulla clausola FOR UPDATE usata nell'istruzione SELECT, vedere Ricevere messaggi modificati dei dati basati sul polling da Oracle E-Business Suite.

  • Specificare un'istruzione DELETE come parte della proprietà di associazione PostPollStatement . Questa istruzione eliminerà tutti i dati dalla tabella dell'interfaccia MS_SAMPLE_EMPLOYEE. In questo esempio è possibile impostare questa proprietà di associazione come:

    DELETE FROM MS_SAMPLE_EMPLOYEE
    

    Dopo questo problema, la prossima volta che verrà eseguita l'istruzione specificata per PollingInput , non verrà recuperata alcuna informazione.

  • Fino a quando non vengono aggiunti altri dati alla tabella dell'interfaccia MS_SAMPLE_EMPLOYEE, non verranno visualizzati messaggi di polling in modo da ripopolare la tabella dell'interfaccia MS_SAMPLE_EMPLOYEE con nuovi record. È possibile farlo eseguendo lo script insert_apps_data.sql fornito con gli esempi. Dopo aver eseguito questo script, l'operazione di polling successiva recupera i nuovi record inseriti nella tabella.

Configurazione del polling nel modello di servizio WCF

Per eseguire il polling di una tabella di interfaccia usando l'adapter Oracle E-Business con il modello di servizio WCF, è necessario:

  • Generare un contratto di servizio WCF (interfaccia) per l'operazione Poll nella tabella dell'interfaccia MS_SAMPLE_EMPLOYEE. A tale scopo, è possibile usare il plug-in Aggiungi plug-in del servizio adapter.

  • Implementare un servizio WCF da questa interfaccia.

  • Ospitare questo servizio WCF usando un host del servizio (System.ServiceModel.ServiceHost).

Informazioni sugli esempi usati in questo argomento

Gli esempi di questo argomento esegue il polling della tabella dell'interfaccia MS_SAMPLE_EMPLOYEE. Uno script per generare la tabella viene fornito con gli esempi. Per altre informazioni sugli esempi, vedere Esempi per l'adapter Oracle EBS. Un esempio, SelectPolling_ServiceModel, basato su questo argomento, viene fornito anche con gli esempi di adapter Oracle E-Business.

Contratto e classe del servizio WCF

È possibile usare il plug-in Add Adapter Service Reference per creare un contratto di servizio WCF (interfaccia) e le classi di supporto per l'operazione di polling . Per altre informazioni sulla generazione di un contratto di servizio WCF, vedere Generare un client WCF o un contratto di servizio WCF per gli artefatti della soluzione Oracle E-Business Suite.

Contratto di servizio WCF (interfaccia)

Il codice seguente mostra il contratto di servizio WCF (interfaccia) generato per l'operazione Poll nella tabella dell'interfaccia 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);
}

Contratti messaggio

Di seguito è riportato il contratto di messaggio per l'operazione Poll nella tabella dell'interfaccia 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;
    }
}

Classe di servizio WCF

Il plug-in Add Adapter Service Reference genera anche un file con stub per la classe di servizio WCF implementata dal contratto di servizio (interfaccia). Il nome del file è OracleEBSBindingService.cs. È possibile inserire la logica per elaborare l'operazione Poll direttamente in questa classe. Il codice seguente mostra la classe di servizio WCF generata dal plug-in Add Adapter Service Reference.

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.");
        }
    }
}

Ricezione di messaggi in ingresso per l'operazione di polling usando un'istruzione SELECT

Questa sezione fornisce istruzioni su come scrivere un'applicazione .NET per ricevere messaggi di polling in ingresso usando l'adapter Oracle E-Business.

Per ricevere messaggi di polling usando un'istruzione SELECT

  1. Usare il plug-in Add Adapter Service Reference per generare un contratto di servizio WCF (interfaccia) e le classi helper per l'operazione Poll nella tabella dell'interfaccia MS_SAMPLE_EMPLOYEE. Per altre informazioni, vedere Generare un client WCF o un contratto di servizio WCF per gli artefatti della soluzione Oracle E-Business Suite. Facoltativamente, è possibile specificare le proprietà di associazione durante la generazione di classi del contratto di servizio e helper. Ciò garantisce che siano impostate correttamente nel file di configurazione generato.

  2. Implementare un servizio WCF dalle classi di interfaccia e helper generate nel passaggio 1. Il metodo Poll di questa classe può generare un'eccezione per interrompere la transazione di polling, se si verifica un errore durante l'elaborazione dei dati ricevuti dall'operazione Poll ; in caso contrario, il metodo non restituisce nulla. È necessario specificare la classe di servizio WCF come indicato di seguito:

    [ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
    

    All'interno del metodo Poll è possibile implementare direttamente la logica dell'applicazione. Questa classe è disponibile in OracleEBSBindingService.cs. Questo codice in questa sottoclasse di esempio esegue la classe OracleEBSBindingService . In questo codice il messaggio di polling ricevuto e viene scritto nella console.

    [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. È necessario implementare la classe seguente per evitare di passare le credenziali come parte dell'URI. Nella seconda parte dell'applicazione verrà creata un'istanza di questa classe per passare le credenziali.

    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. Creare un oggetto OracleEBSBinding e configurare l'operazione di polling specificando le proprietà di associazione. È possibile eseguire questa operazione in modo esplicito nel codice o in modo dichiarativo nella configurazione. È necessario specificare almeno le proprietà di associazione InboundOperationType, PolledDataAvailableStatement, PollingInput e 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. Poiché si esegue il polling di una tabella di interfaccia, è necessario impostare anche il contesto delle applicazioni. Per altre informazioni sul contesto dell'applicazione e sulle proprietà di associazione necessarie per l'impostazione del contesto dell'applicazione, vedere Impostare il contesto dell'applicazione.

    binding.OracleUserName = "myOracleEBSUserName";
    binding.OraclePassword = "myOracleEBSPassword";
    binding.OracleEBSResponsibilityName = "myOracleEBSResponsibility";
    
  6. Specificare le credenziali di Oracle E-Business Suite creando un'istanza della classe PollingCredentials creata nel passaggio 3.

    PollingCredentials credentials = new PollingCredentials();
    credentials.UserName.UserName = "<Enter user name here>";
    credentials.UserName.Password = "<Enter password here>";
    
  7. Creare un'istanza del servizio WCF creato nel passaggio 2.

    // create service instance
    PollingService service = new PollingService();
    
  8. Creare un'istanza di System.ServiceModel.ServiceHost usando il servizio WCF e un URI di connessione di base. L'URI della connessione di base non può contenere l'ID in ingresso, se specificato. È anche necessario passare le credenziali qui.

    // 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. Aggiungere un endpoint di servizio all'host del servizio. Per eseguire questa operazione:

    • Usare l'associazione creata nel passaggio 4.

    • Specificare un URI di connessione contenente le credenziali e, se necessario, un ID in ingresso.

    • Specificare il contratto come "InterfaceTables_FND_APPS_MS_SAMPLE_EMPLOYEE" per eseguire il polling della tabella dell'interfaccia 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. Per ricevere i dati di polling, aprire l'host del servizio. L'adattatore restituirà i dati ogni volta che la query restituisce un set di risultati.

    // Open the service host to begin polling
    serviceHost.Open();
    
  11. Per terminare il polling, chiudere l'host del servizio.

    Importante

    L'adapter continuerà a eseguire il polling fino alla chiusura dell'host del servizio.

    serviceHost.Close();
    

Esempio

Nell'esempio seguente viene illustrata un'applicazione di polling che esegue il polling della tabella dell'interfaccia MS_SAMPLE_EMPLOYEE. La proprietà PollingInput contiene l'istruzione select che legge tutti i dati dalla tabella MS_SAMPLE_EMPLOYEE e l'istruzione post poll elimina tutti i dati dalla stessa tabella. Il primo messaggio di polling fornisce tutti i record della tabella dell'interfaccia MS_SAMPLE_EMPLOYEE. I messaggi di polling successivi non conterranno alcun record perché l'istruzione post poll elimina i record. Finché non vengono aggiunti altri dati alla tabella dell'interfaccia MS_SAMPLE_EMPLOYEE, non verranno visualizzati messaggi di polling. È quindi necessario ripopolare la tabella dell'interfaccia MS_SAMPLE_EMPLOYEE con nuovi record. A tale scopo, eseguire lo script insert_apps_data.sql fornito con gli esempi. Dopo aver eseguito questo script, l'operazione di polling successiva recupererà i nuovi record inseriti nella tabella. L'adapter continuerà a eseguire il polling finché non si chiude l'host del servizio premendo <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();
            }
        }
    }
}

Vedere anche

Eseguire il polling di Oracle E-Business Suite usando il modello di servizio WCF