Description pas à pas de l'exemple WS-Notification

L'exemple de source d'événement est un exemple de code pour un fournisseur de notifications au format WS-Notification 1.0. Il est basé sur des bibliothèques des projets à source ouverte Apache Axis et Eclipse TPTP.

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'EventSourceWsn10.java est disponible dans le répertoire <répertoire_installation_sdk>/samples/wsnt-axis/src/com/wtci/samples/axis/source.

Cet exemple utilise plusieurs classes Apache Axis, des classes de consignation Eclipse 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.axiswsn10.wsa.AttributedURI;
import com.ibm.wtci.samples.axiswsn10.wsa.EndpointReferenceType;
import com.ibm.wtci.samples.axiswsn10.wsn.NotificationConsumer;
import com.ibm.wtci.samples.axiswsn10.wsn.NotificationConsumerService;
import com.ibm.wtci.samples.axiswsn10.wsn.NotificationConsumerServiceLocator;
import com.ibm.wtci.samples.axiswsn10.wsn.NotificationMessageHolderType;
import com.ibm.wtci.samples.axiswsn10.wsn.TopicExpressionType;

import org.apache.axis.encoding.TypeMapping;
import org.apache.axis.encoding.TypeMappingRegistry;
import org.apache.axis.message.MessageElement;
import org.apache.axis.types.URI;
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;
import javax.xml.namespace.QName;

La méthode main d'EventSourceWsn10.java crée une nouvelle instance d'EventSourceWsn10 à 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 createEvents d'EventSourceWsn10.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 createEvents 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 createEvents 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 élément Topic avec le nom 'Topic' et la valeur
            //d'attribut de dialecte 'tec'
            MessageElement[] msgTopic = new MessageElement[1];
            msgTopic[0] = new MessageElement();
            msgTopic[0].setName("Topic");
            msgTopic[0].setAttribute("dialect", "none");
            TopicExpressionType topicExpType = new TopicExpressionType();
            topicExpType.set_any(msgTopic);

            //Définition de l'élément Topic de la notification
            notificationArray[i].setTopic(topicExpType);

            //Définition de l'événement devant constituer le message de la notification
            notificationArray[i].setMessage(events[i]);

            //Définition des informations sur le fournisseur de l'événement dans
            //la notification
            EndpointReferenceType endPointRef = new EndpointReferenceType();
            AttributedURI au = new AttributedURI();
            URI value = new URI("protocol", "your.event.source.address");
            au.set_value(value);
            endPointRef.setAddress(au);
            notificationArray[i].setProducerReference(endPointRef);
        }

        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' et la valeur d'attribut de dialecte 'tec'.
  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[] notificationArray =
            createNotificationMessage(events);

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

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

        //Création d'une instance de NotificationConsumerServiceLocator
        NotificationConsumerService notifierSvc =
            new NotificationConsumerServiceLocator();

        //Utilisation de NotificationConsumerService pour obtenir
        //l'objet NotificationConsumer pour le service
        NotificationConsumer notifier =
            notifierSvc.getNotificationConsumer10Soap(serviceURL);

        //Enregistrement d'une instance de l'objet CbeSerializer pour la sérialisation
        //des objets
        //de type CommonBaseEvent à envoyer
        TypeMappingRegistry reg = (TypeMappingRegistry)
            notifierSvc.getTypeMappingRegistry();
        TypeMapping tm = (TypeMapping) reg.getTypeMapping(endpoint);
        QName qn = new QName("http://www.ibm.com/AC/commonbaseevent1_0_1",
                "CommonBaseEvent");
        tm.register(CommonBaseEvent.class, qn,
                    new CbeSerializerFactory(), null);

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

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. La classe CbeSerializer Factory est enregistrée comme classe de sérialiseur à utiliser pour la sérialisation des objets de type CommonBaseEvent. La classe CbeSerializerFactory renvoie une instance de l'objet CbeSerializer. Cet objet implémente la méthode de sérialisation convertissant les objets CommonBaseEvent à envoyer au format XML.
  6. 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