Compartir a través de


Sondear Oracle E-Business Suite mediante la instrucción SELECT con el modelo de servicio 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 las 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 sondeo o de entrada de 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 del 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 para la operación de sondeo. Puede determinar la acción de sondeo de la interfaz de servicio generada para la operación mediante el complemento Agregar referencia de servicio de adaptador de Visual Studio.
PostPollStatement Especifica un bloque de instrucciones que se ejecuta después de que se ejecute 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á 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 más.

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, sondee la tabla de interfaz 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 de 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 sondeos 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 obtendrá ningún mensaje de sondeo, por lo que debe volver a rellenar la tabla de interfaz 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.

Configuración del sondeo en el modelo de servicio WCF

Para sondear una tabla de interfaz mediante el adaptador de Oracle E-Business con el modelo de servicio WCF, debe hacer lo siguiente:

  • Genere un contrato de servicio WCF (interfaz) para la operación De sondeo en la tabla de interfaz de MS_SAMPLE_EMPLOYEE. Para ello, puede usar el complemento Agregar referencia de servicio de adaptador.

  • Implemente un servicio WCF desde esta interfaz.

  • Hospede este servicio WCF mediante un host de servicio (System.ServiceModel.ServiceHost).

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_ServiceModel, que se basa en este tema, con los ejemplos de adaptadores de Oracle E-Business.

El contrato de servicio y la clase WCF

Puede usar el complemento Agregar referencia de servicio de adaptador para crear un contrato de servicio WCF (interfaz) y clases auxiliares para la operación de sondeo . Para obtener más información sobre cómo generar un contrato de servicio WCF, consulte Generación de un cliente WCF o un contrato de servicio WCF para artefactos de soluciones de Oracle E-Business Suite.

Contrato de servicio WCF (interfaz)

En el código siguiente se muestra el contrato de servicio WCF (interfaz) generado para la operación poll en MS_SAMPLE_EMPLOYEE tabla de interfaz.

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

Contratos de mensaje

A continuación se muestra el contrato de mensaje para la operación de sondeo en MS_SAMPLE_EMPLOYEE tabla de interfaz.

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

Clase de servicio WCF

El complemento Add Adapter Service Reference también genera un archivo que tiene un código auxiliar para la clase de servicio WCF implementada desde el contrato de servicio (interfaz). El nombre del archivo es OracleEBSBindingService.cs. Puede insertar la lógica para procesar la operación Poll directamente en esta clase. En el código siguiente se muestra la clase de servicio WCF generada por el complemento 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.");
        }
    }
}

Recepción de mensajes entrantes para la operación de sondeo mediante una instrucción SELECT

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

Para recibir mensajes de sondeo mediante una instrucción SELECT

  1. Use el complemento Agregar referencia de servicio de adaptador para generar un contrato de servicio WCF (interfaz) y clases auxiliares para la operación Poll en la tabla de interfaz de MS_SAMPLE_EMPLOYEE. Para obtener más información, consulte Generación de un cliente WCF o un contrato de servicio WCF para artefactos de soluciones de Oracle E-Business Suite. Opcionalmente, puede especificar las propiedades de enlace al generar el contrato de servicio y las clases auxiliares. Esto garantiza que se establecen correctamente en el archivo de configuración generado.

  2. Implemente un servicio WCF desde la interfaz y las clases auxiliares generadas en el paso 1. El método Poll de esta clase puede producir una excepción para anular la transacción de sondeo, si se encuentra un error al procesar los datos recibidos de la operación De sondeo ; de lo contrario, el método no devuelve nada. Debe atribuir la clase de servicio WCF de la siguiente manera:

    [ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
    

    Dentro del método Poll , puede implementar la lógica de la aplicación directamente. Esta clase se puede encontrar en OracleEBSBindingService.cs. Este código de este ejemplo subclase la clase OracleEBSBindingService . En este código, el mensaje de sondeo recibido y se escribe en la consola.

    [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. Debe implementar la siguiente clase para evitar pasar credenciales como parte del URI. En la última parte de la aplicación, creará una instancia de esta clase para pasar las credenciales.

    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. Cree una instancia de OracleEBSBinding y configure la operación de sondeo especificando las propiedades de enlace. Puede hacerlo explícitamente en el código o mediante declaración en la configuración. Como mínimo, debe especificar las propiedades de enlace InboundOperationType, PolledDataAvailableStatement, PollingInput y 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. 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 Establecer el contexto de la aplicación.

    binding.OracleUserName = "myOracleEBSUserName";
    binding.OraclePassword = "myOracleEBSPassword";
    binding.OracleEBSResponsibilityName = "myOracleEBSResponsibility";
    
  6. Especifique las credenciales de Oracle E-Business Suite creando instancias de la clase PollingCredentials que creó en el paso 3.

    PollingCredentials credentials = new PollingCredentials();
    credentials.UserName.UserName = "<Enter user name here>";
    credentials.UserName.Password = "<Enter password here>";
    
  7. Cree una instancia del servicio WCF creado en el paso 2.

    // create service instance
    PollingService service = new PollingService();
    
  8. Cree una instancia de System.ServiceModel.ServiceHost mediante el servicio WCF y un URI de conexión base. El URI de conexión base no puede contener el identificador de entrada, si se especifica. También debe pasar las credenciales aquí.

    // 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. Agregue un punto de conexión de servicio al host de servicio. Para ello, siga estos pasos:

    • Use el enlace creado en el paso 4.

    • Especifique un URI de conexión que contenga credenciales y, si es necesario, un identificador de entrada.

    • Especifique el contrato como "InterfaceTables_FND_APPS_MS_SAMPLE_EMPLOYEE" para sondear la tabla de interfaz de 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. Para recibir datos de sondeo, abra el host del servicio. El adaptador devolverá datos cada vez que la consulta devuelva un conjunto de resultados.

    // Open the service host to begin polling
    serviceHost.Open();
    
  11. Para finalizar el sondeo, cierre el host del servicio.

    Importante

    El adaptador seguirá sondeando hasta que se cierre el host de servicio.

    serviceHost.Close();
    

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 primer mensaje de sondeo proporciona todos los registros de la tabla de interfaz MS_SAMPLE_EMPLOYEE. Los mensajes de sondeo posteriores no contendrán ningún registro porque la instrucción post poll elimina los registros. 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 tanto, 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. El adaptador seguirá sondeando hasta que cierre el host de servicio presionando <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();
            }
        }
    }
}

Consulte también

Sondear Oracle E-Business Suite mediante el modelo de servicio WCF