Description pas à pas de l'exemple WS-Notification

L'exemple de source d'événement, EventSource.java, est une source d'événement simple envoyant un événement unique codé en dur aux services Web. Il illustre les étapes suivantes que doit réaliser une source d'événement :

  1. Obtention d'une classe d'événement
  2. Création d'un événement et renseignement des données requises
  3. Utilisation des modules de remplacement de services Web côté client générés pour envoyer un événement

Le code source d'EventSource.java est disponible dans le répertoire <répertoire_installation_sdk>/samples/wsnt-was/src/com/wtci/samples/was/source du kit de développement de logiciels.

Cet exemple utilise des classes de consignation Hyades ainsi que des classes générées à partir de fichiers WSDL. Utilisez les instructions d'importation suivantes pour accéder aux modules requis :

import com.ibm.wtci.samples.waswsn10.emitter.NotificationConsumerService;
import com.ibm.wtci.samples.waswsn10.emitter.NotificationConsumerServiceLocator;
import com.ibm.wtci.samples.waswsn10.wsn.NotificationConsumer;
import com.ibm.wtci.samples.waswsn10.wsn.NotificationMessageHolderType;

import com.ibm.ws.webservices.engine.xmlsoap.SOAPElement;
import com.ibm.ws.webservices.engine.xmlsoap.SOAPFactory;

import org.eclipse.hyades.logging.events.cbe.CommonBaseEvent;
import org.eclipse.hyades.logging.events.cbe.EventFactory;
import org.eclipse.hyades.logging.events.cbe.EventFactoryFactory;
import org.eclipse.hyades.logging.events.cbe.Situation;
import org.eclipse.hyades.logging.events.cbe.util.EventFormatter;

import java.net.URL;

La méthode main d'EventSource.java crée une nouvelle instance d'EventSource à l'aide du constructeur par défaut. Elle appelle ensuite la méthode privée sendEvent, qui contient la logique du programme principal. Une fois la méthode sendEvent exécutée, la méthode main() envoie le message "Notification sent" (Notification envoyée) à la sortie standard.

    /**
     * Méthode main de la source d'événement.
     *
     * @param args
     *            arguments transmis à partir de la ligne de commande
     */
    public static void main(String args[]) {
        EventSourceWsn10 source = new EventSourceWsn10();
        try {
            source.sendEvent();
            System.out.println("Notification sent");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

Création et renseignement de l'événement

La méthode createEvent() d'EventSource.java est une méthode auxiliaire permettant de créer un événement et de renseigner un ensemble minimum de propriétés de cet événement. Cette méthode est appelée par la méthode sendEvent pour créer l'événement à envoyer aux services Web.

    public static CommonBaseEvent[] createEvents() throws Exception {
        CommonBaseEvent[] events = null;

        String cbeFile = System.getProperty("cbe.file");
        if (cbeFile != null) {
            events = EventFormatter.eventsFromCanonicalXMLDoc(cbeFile);
        } else {
            // La première étape consiste à accéder à la classe d'événement
            EventFactory eventFactory = EventFactoryFactory.createEventFactory();

            // Création d'un événement avec un nom d'extension.
            CommonBaseEvent event = eventFactory.createCommonBaseEvent("EVENT");
            event.setCreationTimeAsLong(System.currentTimeMillis());

            // Définition de la description de situation obligatoire pour l'événement.
            Situation situation = eventFactory.createSituation();
            situation.setCategoryName(Situation.REPORT_SITUATION_CATEGORY);
            situation.setReportSituation("INTERNAL", "Succeeded");
            event.setSituation(situation);

            // Définiton de l'identification de composant obligatoire pour
            // la source d'événement
            event.setSourceComponentId("Event Source",
                "source.EventSource",
                "createEvent()",
                "http://www.ibm.com/namespaces/autonomic/Tivoli/Samples",
                "Sample",
                "unknown",
                "hostname");

            // Définition de la version de l'événement de base commun
            event.setVersion("1.0.1");
            // Définition des zones facultatives
            event.setSeverity((short) 10);
            event.setMsg("Common Event Infrastructure Tutorial");

            events = new CommonBaseEvent[] { event };
        }

        return events;
    }

La méthode createEvent réalise les opérations suivantes :

  1. Elle utilise la méthode createEventFactory() d'EventFactoryFactory pour créer un objet EventFactory.
  2. Elle utilise la méthode createCommonBaseEvent(Chaîne) de la classe d'événement pour créer un objet d'événement (instance de CommonBaseEvent). La chaîne spécifiée ("EVENT") est utilisée pour définir la propriété extensionName de l'événement, et l'heure système en cours est utilisée pour définir la propriété creationTime.
  3. Elle définit la valeur de la propriété situation de l'événement. situation étant une propriété complexe, elle est représentée par une classe Java spéciale. Par conséquent, la définition de la propriété situation nécessite plusieurs opérations distinctes :
    1. Création d'un objet Situation.
    2. Utilisation de méthodes d'accès set pour renseigner les propriétés requises de l'objet Situation.
    3. Définition de la propriété situation de l'événement en appelant la méthode Event.setSituation(), qui définit l'objet Situation renseigné.
  4. Elle définit les valeurs de plusieurs autres propriétés de l'événement, certaines étant obligatoires et d'autres facultatives, notamment severity, msg, version et sourceComponentId.
    Remarque : tout comme situation, sourceComponentId est une propriété complexe. Toutefois, ses propriétés secondaires étant toutes des attributs simples représentés par des chaînes, vous pouvez utiliser la méthode auxiliaire setSourceComponentId() plutôt que d'instancier séparément un objet Java spécial.

    Les autres propriétés définies par l'exemple (version, severity et msg) sont toutes des propriétés simples représentées par des chaînes ou des entiers.

  5. Enfin, la méthode createEvent() renvoie l'événement, pour lequel les propriétés sont désormais renseignées.

Création du message de notification

La méthode suivante de l'exemple de source d'événement, createNotificationMessage(événement), est une méthode auxiliaire permettant de créer un message de notification encapsulant l'événement transmis sous forme de paramètre à la méthode. Cette méthode est appelée par la méthode sendEvent pour créer le message de notification à envoyer aux services Web.

    public static NotificationMessageHolderType[] createNotificationMessage(
            CommonBaseEvent events[]) throws Exception {
        NotificationMessageHolderType[] notificationArray = 
            new NotificationMessageHolderType[events.length];
        for (int i = 0; i < events.length; i++) {

            //Création d'une instance de NotificationMessageHolderType
            notificationArray[i] = new NotificationMessageHolderType();

            //Création d'un événement Topic nommé 'Topic'
            SOAPFactory soapFactory = new SOAPFactory();
            SOAPElement topicSE = (SOAPElement)
                soapFactory.createElement("Topic");
            SOAPElement topicSEChild = (SOAPElement)
                topicSE.addChildElement("Topic");
            topicSEChild.setAttribute("dialect","none");
            notificationArray[i].setTopic(topicSE);

            //Définition de l'événement devant constituer le message de la notification
            SOAPElement messageSE = (SOAPElement)
                soapFactory.createElement("Message");
            messageSE.addNamespaceDeclaration("ns2",
                "http://www.ibm.com/AC/commonbaseevent1_0_1");
            messageSE.addAttribute("http://www.w3.org/2001/XMLSchema-instance",
                "type",
                "ns2:CommonBaseEvent");
            String cbeStr = EventFormatter.toCanonicalXMLString(events[i]);
            SOAPElement cbeSE = (SOAPElement)
                soapFactory.createElementFromXMLString(cbeStr);
            messageSE.addChildElement(cbeSE);
            notificationArray[i].setMessage(messageSE);

            //Définition des informations sur le fournisseur de l'événement dans
            //la notification
            SOAPElement producerSE = (SOAPElement)
                soapFactory.createElement("ProducerReference");
            SOAPElement producerSEChild = (SOAPElement)
                soapFactory.createElement("Address",
                "ns1",
                "http://schemas.xmlsoap.org/ws/2003/03/addressing");
            producerSEChild.addTextNode("protocol://your.event.source.address");
            producerSE.addChildElement(producerSEChild);
            notificationArray[i].setProducerReference(producerSE);
        }
        return notificationArray;
    }

La méthode createNotificationMessage(événement) réalise les opérations suivantes :

  1. Elle crée un objet NotificationMessageHolderType contenant les informations de la notification à envoyer.
  2. L'élément Topic de la notification est créé avec le nom 'Topic'. Un élément enfant imbriqué est ajouté pour indiquer que tout ce qui se trouve à l'intérieur de l'élément Topic sera ignoré lors de la réception de la notification.
  3. Le message de la notification est défini comme étant l'événement transmis à la méthode.
  4. Les informations concernant le fournisseur de l'événement sont définies dans la notification.
  5. Le message de notification ainsi créé et contenant les informations est renvoyé au demandeur.

Envoi de l'événement

La dernière méthode de l'exemple de source d'événement, sendEvent(), contient la logique du programme principal. Cette méthode gère toutes les interactions avec le client NotificationConsumer, notamment l'envoi de l'événement.

    private void sendEvent() throws Exception {
        //La première étape consiste à créer un événement
        CommonBaseEvent[] events = createEvents();

        //Création du message de notification encapsulant l'événement
        NotificationMessageHolderType[] notification =
            createNotificationMessage(events);

        //Obtention de l'adresse du service Web NotificationConsumerService
        String endpoint = System.getProperty("service.address");
        if (endpoint == null) {
            //Si aucune adresse n'a été définie, le service Web est supposé être
            //exécuté sur l'hôte local au port 9080 pour WAS
            endpoint = "http://localhost:9080/wsnt-was/services/NotificationConsumer10Soap";
        }

        //Création d'un objet URL pour l'adresse obtenue
        java.net.URL serviceURL = new URL(endpoint);

        //Création d'une instance de NotificationConsumerServiceLocator
        NotificationConsumerService notifierSvc =
            new NotificationConsumerServiceLocator();
        NotificationConsumer notifier =
            notifierSvc.getNotificationConsumer10Soap(serviceURL);

        //Envoi de la notification
        notifier.notify(notification);

    }

La méthode sendEvent() réalise les opérations suivantes :

  1. Elle appelle la méthode auxiliaire createEvent() pour créer et renseigner un nouvel événement.
  2. Elle appelle la méthode auxiliaire createNotificationMessage(événement) pour créer un message de notification encapsulant l'événement créé.
  3. À partir de la propriété système, elle obtient l'adresse des services Web NotificationConsumer, qui traitent la demande de notification.
  4. Elle instancie l'objet NotificationConsumerServiceLocator, qui est ensuite utilisé pour obtenir un objet NotificationConsumer.
  5. Elle envoie l'événement en appelant la méthode notify() de l'objet NotificationConsumer. Cette méthode génère un message SOAP encapsulant l'événement.


Rubriques connexes
Génération des exemples
Exécution des exemples


Concepts associés
Conversion d'un événement du format d'événement de base commun au format d'événement Enterprise Console