Partager via


Recevoir des notifications de modification de base de données Oracle E-Business Suite à l’aide du modèle de service WCF

Cette rubrique montre comment configurer l’adaptateur Oracle E-Business pour recevoir des messages de notification de requête à partir d’une base de données Oracle. Pour illustrer les notifications, envisagez une table, ACCOUNTACTIVITY, avec une colonne « Traité ». Lorsqu’un nouvel enregistrement est inséré dans cette table, la valeur de la colonne État est définie sur « n ». Vous pouvez configurer l’adaptateur pour recevoir des notifications en vous inscrivant aux notifications à l’aide d’une instruction SQL qui récupère tous les enregistrements dont la colonne « Traité » est « n ». Pour ce faire, spécifiez l’instruction SQL pour la propriété de liaison NotificationStatement . Une fois que le client de l’adaptateur a reçu la notification, il peut contenir la logique permettant d’effectuer toutes les tâches suivantes sur la base de données Oracle. Dans cet exemple, par souci de simplicité, le client de l’adaptateur répertorie tous les enregistrements de la table dont la colonne « Traité » est « n ».

Configuration des notifications avec les propriétés de liaison de l’adaptateur Oracle E-Business

Le tableau ci-dessous récapitule les propriétés de liaison de l’adaptateur Oracle E-Business que vous utilisez pour configurer la réception de notifications à partir d’Oracle E-Business Suite. Vous devez spécifier ces propriétés de liaison lors de l’exécution de l’application .NET pour recevoir des notifications.

Binding, propriété Description
InboundOperationType Spécifie l’opération entrante que vous souhaitez effectuer. Pour recevoir des messages de notification, définissez-le sur Notification.
NotificationPort Spécifie le numéro de port que ODP.NET devez ouvrir pour écouter la notification de modification de la base de données Oracle.
NotificationStatement Spécifie l’instruction Select utilisée pour s’inscrire aux notifications de requête. L’adaptateur reçoit un message de notification uniquement lorsque le jeu de résultats de l’instruction Select spécifiée change.
NotifyOnListenerStart Spécifie si l’adaptateur envoie une notification aux clients de l’adaptateur lorsque l’écouteur est démarré.

Pour obtenir une description plus complète de ces propriétés, consultez En savoir plus sur les propriétés de liaison de l’adaptateur BizTalk pour Oracle E-Business Suite. Pour obtenir une description complète de l’utilisation de l’adaptateur Oracle E-Business pour recevoir des notifications d’Oracle E-Business Suite, lisez le reste de cette rubrique.

Configuration des notifications à l’aide du modèle de service WCF

Pour recevoir les notifications à l’aide du modèle de service WCF, vous devez :

  • Générez un contrat de service WCF (interface) pour l’opération notification à partir des métadonnées exposées par l’adaptateur. Pour ce faire, vous pouvez utiliser le plug-in Add Adapter Service Reference.

  • Générez un client WCF pour l’opération Select sur la table ACCOUNTACTIVITY. Pour ce faire, vous pouvez utiliser le plug-in Add Adapter Service Reference.

  • Implémentez un service WCF à partir de cette interface.

  • Hébergez ce service WCF à l’aide d’un hôte de service (System.ServiceModel.ServiceHost).

À propos des exemples utilisés dans cette rubrique

Les exemples de cette rubrique reçoivent une notification pour la table ACCOUNTACTIVITY. Un script pour générer la table est fourni avec les exemples. Pour plus d’informations sur les exemples, consultez Exemples pour l’adaptateur Oracle EBS. Un exemple , Notification_ServiceModel, basé sur cette rubrique, est également fourni avec les exemples d’adaptateur Oracle E-Business.

Contrat et classe de service WCF

Vous pouvez utiliser le plug-in Add Adapter Service Reference pour créer un contrat de service WCF (interface) et des classes de prise en charge pour l’opération de notification . Pour plus d’informations sur la génération d’un contrat de service WCF, consultez Générer un client WCF ou un contrat de service WCF pour les artefacts de solution Oracle E-Business Suite.

Contrat de service WCF (interface)

Le code suivant montre le contrat de service WCF (interface) généré pour l’opération de notification .

[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")]
[System.ServiceModel.ServiceContractAttribute(Namespace="http://schemas.microsoft.com/OracleEBS/", ConfigurationName="Notification_")]
public interface Notification_ {

    // CODEGEN: Generating message contract since the wrapper namespace (https://schemas.microsoft.com/OracleEBS/2008/05/Notification/) of message Notification
    // does not match the default value (https://schemas.microsoft.com/OracleEBS/)
    [System.ServiceModel.OperationContractAttribute(IsOneWay=true, Action="Notification")]
    void Notification(Notification request);
}

Contrats de message

Voici le contrat de message pour l’opération de notification.

[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")]
[System.ServiceModel.MessageContractAttribute(WrapperName="Notification", WrapperNamespace="http://schemas.microsoft.com/OracleEBS/2008/05/Notification/", IsWrapped=true)]
public partial class Notification {

    [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://schemas.microsoft.com/OracleEBS/2008/05/Notification/", Order=0)]
    public schemas.microsoft.com.OracleEBS._2008._05.Notification.NotificationDetails[] Details;

    [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://schemas.microsoft.com/OracleEBS/2008/05/Notification/", Order=1)]
    public string Info;

    [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://schemas.microsoft.com/OracleEBS/2008/05/Notification/", Order=2)]
    public string[] ResourceNames;

    [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://schemas.microsoft.com/OracleEBS/2008/05/Notification/", Order=3)]
    public string Source;

    [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://schemas.microsoft.com/OracleEBS/2008/05/Notification/", Order=4)]
    public string Type;

    public Notification() {
    }

    public Notification(schemas.microsoft.com.OracleEBS._2008._05.Notification.NotificationDetails[] Details, string Info, string[] ResourceNames, string Source, string Type) {
        this.Details = Details;
        this.Info = Info;
        this.ResourceNames = ResourceNames;
        this.Source = Source;
        this.Type = Type;
    }
}

Classe de service WCF

Le plug-in Add Adapter Service Reference génère également un fichier qui a un stub pour la classe de service WCF implémentée à partir du contrat de service (interface). Le nom du fichier est OracleEBSBindingService.cs. Vous pouvez insérer la logique pour traiter l’opération de notification directement dans cette classe. Le code suivant montre la classe de service WCF générée par le plug-in Add Adapter Service Reference.

namespace OracleEBSBindingNamespace {

    public class OracleEBSBindingService : Notification_ {

        // CODEGEN: Generating message contract since the wrapper namespace (https://schemas.microsoft.com/OracleEBS/2008/05/Notification/) of message Notification
        // does not match the default value (https://schemas.microsoft.com/OracleEBS/)
        public virtual void Notification(Notification request) {
            throw new System.NotImplementedException("The method or operation is not implemented.");
        }
    }
}

Réception de notifications de requête à l’aide du modèle de service WCF

Cette section fournit des instructions sur l’écriture d’une application .NET pour recevoir des notifications de requête à l’aide de l’adaptateur Oracle E-Business.

Pour recevoir des notifications de requête

  1. Utilisez le plug-in Add Adapter Service Reference pour générer un client WCF pour l’opération Select sur la table ACCOUNTACTIVITY . Vous utiliserez ce client pour effectuer des opérations de sélection après avoir reçu un message de notification. Ajoutez une nouvelle classe, TableOperation.cs, à votre projet et ajoutez l’extrait de code suivant pour effectuer une opération Select.

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    namespace Notification_ServiceModel
    {
        class TableOperation
        {
            public void TableOp()
            {
                //////////////////////////////////////////////////////////////////////
                // CREATING THE CLIENT AND SETTING CLIENT CREDENTIALS
                //////////////////////////////////////////////////////////////////////
    
                Tables_APPS_ACCOUNTACTIVITYClient client = new Tables_APPS_ACCOUNTACTIVITYClient();
                client.ClientCredentials.UserName.UserName = "<Enter user name here>";
                client.ClientCredentials.UserName.Password = "<Enter password here>";
    
                ////////////////////////////////////////////////////////////////////
                // OPENING THE CLIENT
                //////////////////////////////////////////////////////////////////////
                try
                {
                    Console.WriteLine("Opening the client ...");
                    client.Open();
                }
                catch (Exception ex)
                {
                    Console.WriteLine("Exception: " + ex.Message);
                    throw;
                }
    
                ////////////////////////////////////////////////////////////////////////////////////////
                // SELECTING THE LAST INSERTED VALUES
                ////////////////////////////////////////////////////////////////////////////////////////
                Console.WriteLine("The application will now select the last inserted record");
    
                schemas.microsoft.com.OracleEBS._2008._05.TableViewRecord.APPS.ACCOUNTACTIVITY.SelectRecord[] selectRecords;
    
                try
                {
                    selectRecords = client.Select("*", "WHERE PROCESSED = 'n'");
                }
                catch (Exception ex)
                {
                    Console.WriteLine("Exception: " + ex.Message);
                    throw;
                }
    
                Console.WriteLine("The details of the newly added records are:");
                Console.WriteLine("********************************************");
                for (int i = 0; i < selectRecords.Length; i++)
                {
                    Console.WriteLine("Transaction ID   : " + selectRecords[i].TID);
                    Console.WriteLine("Account ID       : " + selectRecords[i].ACCOUNT);
                    Console.WriteLine("Processed Status : " + selectRecords[i].PROCESSED);
                    Console.WriteLine();
                }
                Console.WriteLine("********************************************");
            }
        }
    }
    
    
  2. Utilisez le plug-in Add Adapter Service Reference pour générer un contrat de service WCF (interface) et des classes d’assistance pour l’opération de notification .

    Pour plus d’informations, consultez Générer un client WCF ou un contrat de service WCF pour les artefacts de solution Oracle E-Business Suite. Vous pouvez éventuellement spécifier les propriétés de liaison lors de la génération du contrat de service et des classes d’assistance. Cela garantit qu’ils sont correctement définis dans le fichier de configuration généré.

  3. Implémentez un service WCF à partir des classes d’interface et d’assistance générées à l’étape 2. La méthode Notification de cette classe peut lever une exception pour abandonner l’opération, si une erreur se produit lors du traitement des données reçues de l’opération de notification ; sinon, la méthode ne retourne rien. Vous devez attribuer la classe de service WCF comme suit :

    [ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
    

    Dans la méthode Notification , vous pouvez implémenter directement votre logique d’application. Cette classe se trouve dans OracleEBSBindingService.cs. Ce code dans cet exemple sous-classe la classe OracleEBSBindingService . Dans ce code, le message de notification reçu est écrit dans la console. En outre, la méthode TableOp dans la classe TableOperation est appelée pour effectuer l’opération Select.

    [ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
    
    public class NotificationService : OracleEBSBindingNamespace.OracleEBSBindingService
    {
        public override void Notification(Notification request)
        {
            Console.WriteLine("\nNew Notification Received");
            Console.WriteLine("*************************************************");
            Console.WriteLine(request.Info);
            Console.WriteLine(request.Source);
            Console.WriteLine(request.Type);
            Console.WriteLine("*************************************************");
    
            TableOperation Ops = new TableOperation();
            Ops.TableOp();
    
        }
    }
    
  4. Vous devez implémenter la classe suivante pour transmettre les informations d’identification pour Oracle E-Business Suite. Dans la dernière partie de l’application, vous allez instancier cette classe pour transmettre les informations d’identification.

    class NotificationCredentials : 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 NotificationCredentials();
            clone.UserName.UserName = this.UserName.UserName;
            clone.UserName.Password = this.UserName.Password;
            return clone;
        }
    }
    
  5. Créez un OracleEBSBinding et configurez l’adaptateur pour recevoir des notifications de requête en spécifiant les propriétés de liaison. Vous pouvez le faire de manière explicite dans le code ou de manière déclarative dans la configuration. Au minimum, vous devez spécifier les propriétés de liaison InboundOperationType et NotificationStatement .

    OracleEBSBinding binding = new OracleEBSBinding();
    binding.InboundOperationType = InboundOperation.Notification;
    binding.NotificationStatement = "SELECT TID,ACCOUNT,PROCESSED FROM APPS.ACCOUNTACTIVITY WHERE PROCESSED = 'n'";
    binding.NotifyOnListenerStart = true;
    binding.NotificationPort = 10;
    

    Important

    La valeur de la propriété de liaison NotificationPort doit être définie sur le même numéro de port que vous devez avoir ajouté à la liste des exceptions du Pare-feu Windows. Pour obtenir des instructions sur l’ajout de ports à la liste des exceptions du Pare-feu Windows, consultez https://go.microsoft.com/fwlink/?LinkID=196959.

    Important

    Si vous ne définissez pas la propriété de liaison NotificationPort , l’adaptateur suppose la valeur par défaut -1 pour cette propriété de liaison. Dans ce cas, vous devrez désactiver complètement le Pare-feu Windows pour recevoir des messages de notification.

  6. Spécifiez les informations d’identification Oracle E-Business Suite en instanciant la classe NotificationCredentials que vous avez créée à l’étape 4.

    NotificationCredentials credentials = new NotificationCredentials();
    credentials.UserName.UserName = "<Enter user name here>";
    credentials.UserName.Password = "<Enter password here>";
    
  7. Créez un instance du service WCF créé à l’étape 3.

    // create service instance
    NotificationService service = new NotificationService();
    
  8. Créez un instance de System.ServiceModel.ServiceHost à l’aide du service WCF et d’un URI de connexion de base. Vous devez également spécifier les informations d’identification ici.

    // 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. Ajoutez un point de terminaison de service à l’hôte de service. Pour ce faire :

    • Utilisez la liaison créée à l’étape 5.

    • Spécifiez un URI de connexion qui contient des informations d’identification et, si nécessaire, un ID de trafic entrant.

    • Spécifiez le contrat comme « Notification_ ».

      // Add service endpoint: be sure to specify Notification_ as the contract
      Uri ConnectionUri = new Uri("oracleebs://ebs_instance_name?");
      serviceHost.AddServiceEndpoint("Notification_", binding, ConnectionUri);
      
  10. Pour recevoir un message de notification, ouvrez l’hôte de service.

    // Open the service host to begin receiving notifications
    serviceHost.Open();
    
  11. Pour arrêter de recevoir des notifications, fermez l’hôte de service.

    serviceHost.Close();
    

Exemple

L’exemple suivant montre une application .NET pour recevoir des messages de notification pour la table ACCOUNTACTIVITY.

Notes

L’extrait de code suivant instancie une classe TableOperation.cs et appelle la méthode TableOp . La classe et la méthode sont décrites à l’étape 1.

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 Notification_ServiceModel
{
    [ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]

    public class NotificationService : OracleEBSBindingNamespace.OracleEBSBindingService
    {
        public override void Notification(Notification request)
        {
            Console.WriteLine("\nNew Notification Received");
            Console.WriteLine("*************************************************");
            Console.WriteLine(request.Info);
            Console.WriteLine(request.Source);
            Console.WriteLine(request.Type);
            Console.WriteLine("*************************************************");

            TableOperation Ops = new TableOperation();
            Ops.TableOp();

        }
    }

    class NotificationCredentials : 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 NotificationCredentials();
            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 receiving notifications...");
                Console.ReadLine();

                OracleEBSBinding binding = new OracleEBSBinding();
                binding.InboundOperationType = InboundOperation.Notification;
                binding.NotificationStatement = "SELECT TID,ACCOUNT,PROCESSED FROM APPS.ACCOUNTACTIVITY WHERE PROCESSED = 'n'";
                binding.NotifyOnListenerStart = true;
                binding.NotificationPort = 10;

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

                NotificationCredentials credentials = new NotificationCredentials();
                credentials.UserName.UserName = "<Enter user name here>";
                credentials.UserName.Password = "<Enter password here>";

                Console.WriteLine("Opening service host...");
                NotificationService service = new NotificationService();
                serviceHost = new ServiceHost(service, baseUri);
                serviceHost.Description.Behaviors.Add(credentials);
                serviceHost.AddServiceEndpoint("Notification_", binding, ConnectionUri);
                serviceHost.Open();
                Console.WriteLine("Service host opened...");
                Console.WriteLine("Waiting for notification...");

                Console.WriteLine("\nHit <RETURN> to stop receiving notification");
                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();
            }

        }
    }
}

Voir aussi

Développer des applications Oracle E-Business Suite à l’aide du modèle de service WCF