Condividi tramite


Eseguire il polling di Oracle E-Business Suite usando l'istruzione SELECT con il modello di canale 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 di interfaccia, delle viste di interfaccia, delle tabelle e delle viste in Oracle E-Business Suite. È possibile specificare un'istruzione SELECT come istruzione di polling eseguita periodicamente dall'adattatore per eseguire il polling di Oracle E-Business Suite. È anche possibile specificare un blocco di codice PL/SQL post-poll eseguito dall'adattatore 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'adattatore supporta il polling, vedere Supporto per le chiamate in ingresso tramite polling.

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

La tabella seguente riepiloga 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 desidera eseguire l'operazione di 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, espresso 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 sondaggi successivi. Se l'istruzione viene eseguita entro l'intervallo specificato, l'adattatore rimane in sospensione 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.

Per abilitare il polling, è necessario specificare un valore per la proprietà di associazione PollingInput . L'istruzione di polling viene eseguita solo se sono disponibili dati per il polling, 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 Aggiungi riferimento al servizio adapter di Visual Studio.
PostPollStatement Specifica un blocco di istruzioni eseguito dopo l'esecuzione dell'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 di cui viene eseguito il polling. Se nella tabella non sono disponibili dati, l'adattatore viene ripristinato per eseguire 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 dell'adapter BizTalk per Oracle E-Business Suite. Per una descrizione completa dell'utilizzo dell'adattatore Oracle E-Business per eseguire il polling del database Oracle, leggere il resto di questo argomento.

Come illustra il polling in questo argomento

In questo argomento viene illustrato in che modo l'adapter Oracle E-Business supporta la ricezione di messaggi di modifica dei dati tramite istruzioni SELECT, viene eseguito il polling della tabella dell'interfaccia MS_SAMPLE_EMPLOYEE nell'applicazione Libreria oggetti applicazione. 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 la tabella di interfaccia sottoposta a polling (MS_SAMPLE_EMPLOYEE) contiene dati. 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 di MS_SAMPLE_EMPLOYEE. In questo esempio è possibile impostare questa proprietà di associazione come:

    DELETE FROM MS_SAMPLE_EMPLOYEE  
    

    Dopo questo problema, la volta successiva che verrà eseguita l'istruzione specificata per PollingInput , non recupererà alcun dato.

  • Finché non vengono aggiunti altri dati alla tabella dell'interfaccia MS_SAMPLE_EMPLOYEE, non verranno visualizzati messaggi di polling, pertanto è 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.

Utilizzo del messaggio di richiesta di polling

L'adapter richiama l'operazione di polling sul codice per eseguire il polling di Oracle E-Business Suite. Ovvero, l'adattatore invia un messaggio di richiesta di polling ricevuto tramite una forma di canale IInputChannel. Il messaggio di richiesta di polling contiene il set di risultati della query specificata dalla proprietà di associazione PollingInput . È possibile utilizzare il messaggio di polling in uno dei due modi seguenti:

  • Per utilizzare il messaggio usando il flusso node-value, è necessario chiamare il metodo WriteBodyContents nel messaggio di risposta e passarlo a xmlDictionaryWriter che implementa il flusso node-value.

  • Per utilizzare il messaggio usando il flusso di nodi, è possibile chiamare GetReaderAtBodyContents nel messaggio di risposta per ottenere un XmlReader.

Informazioni sugli esempi usati in questo argomento

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

Ricezione di messaggi in ingresso per l'operazione di polling tramite il modello di canale WCF

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

Per ricevere messaggi di polling dall'adapter

  1. Creare un progetto Microsoft Visual C# ® in Visual Studio. Per questo argomento, creare un'applicazione console.

  2. Nella Esplora soluzioni aggiungere il riferimento a Microsoft.Adapters.OracleEBS, , Microsoft.ServiceModel.ChannelsSystem.ServiceModele System.Runtime.Serialization.

  3. Aprire il file Program.cs e aggiungere gli spazi dei nomi seguenti:

    • Microsoft.Adapters.OracleEBS

    • System.ServiceModel

    • System.ServiceModel.Description

    • System.ServiceModel.Channels

    • System.Xml

  4. Specificare un URI di connessione. Per altre informazioni sull'URI di connessione della scheda, vedere Creare l'URI di connessione Oracle E-Business Suite.

    Uri ConnectionUri = new Uri("oracleebs://ebs_instance_name");  
    
  5. Creare un'istanza di OracleEBSBinding e impostare le proprietà di associazione necessarie per configurare il polling. È necessario impostare almeno le proprietà di associazione InboundOperationType, PolledDataAvailableStatement, PollingInput e PollingAction . Per altre informazioni sulle proprietà di associazione usate per configurare il polling, vedere Supporto per le chiamate in ingresso tramite polling.

    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";  
    
  6. 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 = "<Enter user name here>";  
    binding.OraclePassword = "<Enter password here>";  
    binding.OracleEBSResponsibilityName = "<Enter responsibility here>";  
    
  7. Creare una raccolta di parametri di associazione e impostare le credenziali.

    ClientCredentials credentials = new ClientCredentials();  
    credentials.UserName.UserName = "<Enter user name here>";  
    credentials.UserName.Password = "<Enter password here>";  
    
    BindingParameterCollection bindingParams = new BindingParameterCollection();  
    bindingParams.Add(credentials);  
    
  8. Creare un listener del canale e aprirlo. Per creare il listener, richiamare il metodo IInputChannelListener<> inOracleEBSBinding.

    IChannelListener<IInputChannel> listener = binding.BuildChannelListener<IInputChannel>(connectionUri, bindingParams);  
    listener.Open();  
    
  9. Ottenere un canale IInputChannel richiamando il metodo AcceptChannel nel listener e aprirlo.

    IInputChannel channel = listener.AcceptChannel();  
    channel.Open();  
    
  10. Richiamare Receive sul canale per ottenere il messaggio in ingresso successivo dall'adapter.

    Message message = channel.Receive();  
    
  11. Utilizzare il set di risultati restituito dall'operazione in ingresso. È possibile utilizzare il messaggio utilizzando xmlReader o XmlDictionaryWriter.

    XmlReader reader = message.GetReaderAtBodyContents();  
    
  12. Chiudere il canale al termine dell'elaborazione della richiesta.

    channel.Close()  
    

    Importante

    Dopo aver completato l'elaborazione dell'operazione in ingresso, è necessario chiudere il canale. La mancata chiusura del canale può influire sul comportamento del codice.

  13. Chiudere il listener al termine della ricezione di messaggi modificati dai dati.

    listener.Close()  
    

    Importante

    La chiusura del listener non chiude i canali creati usando il listener. È necessario chiudere in modo esplicito ogni canale creato usando il listener.

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 della tabella MS_SAMPLE_EMPLOYEE e l'istruzione post poll elimina tutti i dati dalla stessa tabella. Il messaggio di polling viene scritto in C:\PollingOutput.xml.

I messaggi di polling successivi non contengono record finché non vengono aggiunti altri dati alla tabella dell'interfaccia MS_SAMPLE_EMPLOYEE. È 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. L'adapter continuerà a eseguire il polling fino a chiudere l'host del servizio premendo <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();  
                }  
            }  
        }  
    }  
}  

Vedere anche

Sviluppare applicazioni Oracle E-Business Suite usando il modello di canale WCF