Compartir a través de


Sondear Oracle E-Business Suite mediante la instrucción SELECT con el modelo de canal WCF

Puede configurar el adaptador de Oracle E-Business para recibir mensajes periódicos de cambio de datos mediante una instrucción SELECT para sondear continuamente las tablas de interfaz, las vistas de interfaz, las tablas y las vistas de Oracle E-Business Suite. Puede especificar una instrucción SELECT como una instrucción de sondeo que el adaptador ejecuta periódicamente para sondear Oracle E-Business Suite. También puede especificar un bloque de código PL/SQL posterior al sondeo que el adaptador ejecuta después de ejecutar la instrucción de sondeo.

Para habilitar el sondeo, debe especificar determinadas propiedades de enlace como se describe en este tema. Para obtener más información sobre cómo el adaptador admite el sondeo, consulte Compatibilidad con llamadas entrantes mediante sondeo.

Configuración de una operación de sondeo con propiedades de enlace del adaptador de Oracle E-Business Suite

En la tabla siguiente se resumen las propiedades de enlace del adaptador de Oracle E-Business que se usan para configurar el adaptador para recibir mensajes de cambio de datos. Debe especificar estas propiedades de enlace al ejecutar la aplicación de sondeo.

Binding (propiedad) Descripción
InboundOperationType Especifica si desea realizar la operación de entrada de sondeo o notificación . El valor predeterminado es Sondeo.
PolledDataAvailableStatement Especifica la instrucción SQL que ejecuta el adaptador para determinar si hay datos disponibles para el sondeo. Solo si hay un registro disponible, se ejecutará la instrucción SELECT que especifique para la propiedad de enlace PollingInput .
PollingInterval Especifica el intervalo, en segundos, en el que el adaptador de Oracle E-Business ejecuta la instrucción especificada para la propiedad de enlace PolledDataAvailableStatement . El valor predeterminado es 30 segundos. El intervalo de sondeo determina el intervalo de tiempo entre sondeos sucesivos. Si la instrucción se ejecuta dentro del intervalo especificado, el adaptador se suspende durante el tiempo restante en el intervalo.
PollingInput Especifica la instrucción de sondeo. Para sondear mediante una instrucción SELECT, debe especificar una instrucción SELECT para esta propiedad de enlace. El valor predeterminado es null.

Debe especificar un valor para la propiedad de enlace PollingInput para habilitar el sondeo. La instrucción de sondeo solo se ejecuta si hay datos disponibles para el sondeo, que viene determinado por la propiedad de enlace PolledDataAvailableStatement .
PollingAction Especifica la acción de la operación de sondeo. Puede determinar la acción de sondeo desde la interfaz de servicio generada para la operación mediante el complemento Agregar referencia del servicio adaptador de Visual Studio.
PostPollStatement Especifica un bloque de instrucciones que se ejecuta después de ejecutar la instrucción especificada por la propiedad de enlace PollingInput .
PollWhileDataFound Especifica si el adaptador de Oracle E-Business omite el intervalo de sondeo y ejecuta continuamente la instrucción de sondeo, si los datos están disponibles en la tabla que se están sondeando. Si no hay datos disponibles en la tabla, el adaptador revierte para ejecutar la instrucción de sondeo en el intervalo de sondeo especificado. El valor predeterminado es False.

Para obtener una descripción más completa de estas propiedades, vea Leer sobre las propiedades de enlace del adaptador de BizTalk para Oracle E-Business Suite. Para obtener una descripción completa de cómo usar el adaptador de Oracle E-Business para sondear la base de datos de Oracle, lea el resto de este tema.

Cómo muestra este tema el sondeo

En este tema, para demostrar cómo el adaptador de Oracle E-Business admite la recepción de mensajes de cambio de datos mediante instrucciones SELECT, sondea la tabla de interfaz de MS_SAMPLE_EMPLOYEE en la aplicación Biblioteca de objetos de aplicación. Esta tabla se crea al ejecutar el script create_apps_artifacts.sql proporcionado con los ejemplos para crear estos objetos en Oracle E-Business Suite.

Para demostrar una operación de sondeo, hacemos lo siguiente:

  • Especifique una instrucción SELECT para la propiedad de enlace PolledDataAvailableStatement para determinar dónde se sondea (MS_SAMPLE_EMPLOYEE) la tabla de interfaz tiene datos. En este ejemplo, puede establecer esta propiedad de enlace como:

    SELECT COUNT (*) FROM MS_SAMPLE_EMPLOYEE  
    

    Esto garantiza que el adaptador ejecute la instrucción de sondeo solo cuando la tabla de interfaz MS_SAMPLE_EMPLOYEE tenga algunos registros.

  • Especifique una instrucción SELECT para la propiedad de enlace PollingInput . Esta instrucción recupera todas las filas de la tabla de interfaz MS_SAMPLE_EMPLOYEE. En este ejemplo, puede establecer esta propiedad de enlace como:

    SELECT * FROM MS_SAMPLE_EMPLOYEE FOR UPDATE  
    

    Nota

    Para obtener información sobre la cláusula FOR UPDATE usada en la instrucción SELECT, consulte Recepción de mensajes modificados por datos basados en sondeo de Oracle E-Business Suite.

  • Especifique una instrucción DELETE como parte de la propiedad de enlace PostPollStatement . Esta instrucción eliminará todos los datos de MS_SAMPLE_EMPLOYEE tabla de interfaz. En este ejemplo, puede establecer esta propiedad de enlace como:

    DELETE FROM MS_SAMPLE_EMPLOYEE  
    

    Después de esto, la próxima vez que se ejecute la instrucción especificada para PollingInput , no capturará ningún dato.

  • Hasta que se agreguen más datos a la tabla de interfaz de MS_SAMPLE_EMPLOYEE, no recibirá ningún mensaje de sondeo, por lo que debe volver a rellenar la tabla de interfaz de MS_SAMPLE_EMPLOYEE con nuevos registros. Para ello, ejecute el script insert_apps_data.sql proporcionado con los ejemplos. Después de ejecutar este script, la siguiente operación de sondeo capturará los nuevos registros insertados en la tabla.

Consumo del mensaje de solicitud de sondeo

El adaptador invoca la operación de sondeo en el código para sondear Oracle E-Business Suite. Es decir, el adaptador envía un mensaje de solicitud de sondeo que recibe a través de una forma de canal IInputChannel. El mensaje de solicitud de sondeo contiene el conjunto de resultados de la consulta especificada por la propiedad de enlace PollingInput . Puede consumir el mensaje de sondeo de una de estas dos maneras:

  • Para consumir el mensaje mediante streaming de valor de nodo, debe llamar al método WriteBodyContents en el mensaje de respuesta y pasarlo un XmlDictionaryWriter que implemente streaming de valor de nodo.

  • Para consumir el mensaje mediante streaming de nodos, puede llamar a GetReaderAtBodyContents en el mensaje de respuesta para obtener un xmlReader.

Acerca de los ejemplos usados en este tema

Los ejemplos de este tema sondean la tabla de interfaz MS_SAMPLE_EMPLOYEE. Se proporciona un script para generar la tabla con los ejemplos. Para obtener más información sobre los ejemplos, consulte Ejemplos para el adaptador de Oracle EBS. También se proporciona un ejemplo, SelectPolling_ChannelModel, que se basa en este tema, con los ejemplos de adaptadores de Oracle E-Business.

Recepción de mensajes entrantes para la operación de sondeo mediante el modelo de canal WCF

En esta sección se proporcionan instrucciones sobre cómo escribir una aplicación .NET (modelo de canal) para recibir mensajes de sondeo entrantes mediante el adaptador de Oracle E-Business.

Para recibir mensajes de sondeo del adaptador

  1. Cree un proyecto de Microsoft Visual C# ® en Visual Studio. En este tema, cree una aplicación de consola.

  2. En el Explorador de soluciones, agregue referencia a Microsoft.Adapters.OracleEBS, Microsoft.ServiceModel.Channels, System.ServiceModely System.Runtime.Serialization.

  3. Abra el archivo Program.cs y agregue los siguientes espacios de nombres:

    • Microsoft.Adapters.OracleEBS

    • System.ServiceModel

    • System.ServiceModel.Description

    • System.ServiceModel.Channels

    • System.Xml

  4. Especifique un URI de conexión. Para obtener más información sobre el URI de conexión del adaptador, consulte Creación del URI de conexión de Oracle E-Business Suite.

    Uri ConnectionUri = new Uri("oracleebs://ebs_instance_name");  
    
  5. Cree una instancia de OracleEBSBinding y establezca las propiedades de enlace necesarias para configurar el sondeo. Como mínimo, debe establecer las propiedades de enlace InboundOperationType, PolledDataAvailableStatement, PollingInput y PollingAction . Para obtener más información sobre las propiedades de enlace usadas para configurar el sondeo, vea Compatibilidad con llamadas entrantes mediante sondeo.

    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. Dado que está sondeando una tabla de interfaz, también debe establecer el contexto de las aplicaciones. Para obtener más información sobre el contexto de la aplicación y las propiedades de enlace necesarias para establecer el contexto de la aplicación, consulte Establecimiento del contexto de la aplicación.

    binding.OracleUserName = "<Enter user name here>";  
    binding.OraclePassword = "<Enter password here>";  
    binding.OracleEBSResponsibilityName = "<Enter responsibility here>";  
    
  7. Cree una colección de parámetros de enlace y establezca las credenciales.

    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. Cree un agente de escucha de canal y ábralo. Para crear el agente de escucha, invoque el método BuildChannelListener<IInputChannel> en OracleEBSBinding.

    IChannelListener<IInputChannel> listener = binding.BuildChannelListener<IInputChannel>(connectionUri, bindingParams);  
    listener.Open();  
    
  9. Obtenga un canal IInputChannel invocando el método AcceptChannel en el agente de escucha y ábralo.

    IInputChannel channel = listener.AcceptChannel();  
    channel.Open();  
    
  10. Invoque Receive en el canal para obtener el siguiente mensaje entrante del adaptador.

    Message message = channel.Receive();  
    
  11. Consuma el conjunto de resultados devuelto por la operación de entrada. Puede consumir el mensaje mediante XmlReader o XmlDictionaryWriter.

    XmlReader reader = message.GetReaderAtBodyContents();  
    
  12. Cierre el canal cuando haya completado el procesamiento de la solicitud.

    channel.Close()  
    

    Importante

    Debe cerrar el canal una vez que haya terminado de procesar la operación de entrada. Si no se cierra el canal, puede afectar al comportamiento del código.

  13. Cierre el agente de escucha cuando haya terminado de recibir mensajes modificados de datos.

    listener.Close()  
    

    Importante

    Cerrar el agente de escucha no cierra los canales creados mediante el agente de escucha. Debe cerrar explícitamente cada canal creado mediante el agente de escucha.

Ejemplo

En el ejemplo siguiente se muestra una aplicación de sondeo que sondea la tabla de interfaz de MS_SAMPLE_EMPLOYEE. La propiedad PollingInput contiene la instrucción select que lee todos los datos de la tabla MS_SAMPLE_EMPLOYEE y la instrucción post poll elimina todos los datos de la misma tabla. El mensaje de sondeo se escribe en C:\PollingOutput.xml.

Los mensajes de sondeo posteriores no contendrán ningún registro hasta que se agreguen más datos a la tabla de interfaz MS_SAMPLE_EMPLOYEE. Para ello, ejecute el script insert_apps_data.sql proporcionado con los ejemplos. Después de ejecutar este script, la siguiente operación de sondeo capturará los nuevos registros insertados en la tabla. El adaptador seguirá sondeando hasta que cierre el host de servicio presionando <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();  
                }  
            }  
        }  
    }  
}  

Consulte también

Desarrollo de aplicaciones de Oracle E-Business Suite mediante el modelo de canal WCF