Révision structurée de l'exemple WS-Notification

L'exemple de source d'événements est un exemple de code pour un programme de génération de notification WS-Notification 1.0. Il utilise des bibliothèques des projets Open Source Apache Axis et Eclipse TPTP.

Il illustre la procédure ci-dessous, qui doit être suivie par une source d'événements :

  1. Obtention d'un magasin d'événements
  2. Création d'un événement et population avec les données nécessaires
  3. Utilisation des éléments de remplacement de services Web générés côté client pour envoyer un événement

Le code source de EventSourceWsn10.java est disponible dans le répertoire <sdk_install_dir>/samples/wsnt-axis/src/com/wtci/samples/axis/source.

Cet exemple utilise plusieurs classes Apache Axis, classes de journalisation Eclipse Hyades et classes générées à partir de fichiers WSDL. Utilisez les instructions d'importation ci-dessous pour accéder aux packages nécessaires :

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 de EventSourceWsn10.java crée une instance de EventSourceWsn10 à l'aide du constructeur par défaut. Elle appelle ensuite la méthode privée sendEvent(), qui contient la logique de programme principale. Une fois que la méthode sendEvent() renvoie un résultat, la méthode main() imprime le message "Notification sent" (Notification envoyée) dans la sortie standard.

    /**
     * Main method for the event source.
     * 
     * @param args
     *            arguments passed from the command line
     */
    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 population de l'événement

La méthode createEvents de EventSourceWsn10.java est une méthode auxiliaire utilisée pour créer un événement et le peupler avec un ensemble réduit de données de propriété. Cette méthode est appelée par la méthode sendEvent pour créer l'événement qui est envoyé 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 {
            // Première étape d'accès au magasin d'événements
            EventFactory eventFactory =
                EventFactoryFactory.createEventFactory();

            // Création d'un événement sans 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éfinition de l'identification de composant obligatoire
            // pour la source d'événements
            event.setSourceComponentId("Event Source",
                "source.EventSource",
                "createEvent()",
                "http://www.ibm.com/namespaces/autonomic/Tivoli/Samples",
                "Sample",
                "unknown",
                "hostname");

            // Définition de la version Common Base Event
            event.setVersion("1.0.1");
            // Définition des champs facultatifs
            event.setSeverity((short) 10);
            event.setMsg("Common Event Infrastructure Tutorial");

            events = new CommonBaseEvent[] { event };
        }

        return events;
    }

La méthode createEvents exécute cette procédure :

  1. Elle utilise la méthode createEventFactory() de EventFactoryFactory pour créer un objet EventFactory.
  2. Elle utilise la méthode createCommonBaseEvent(String) du magasin d'événements pour créer un objet event (une instance de CommonBaseEvent). La chaîne spécifiée ("EVENT") permet de définir la propriété extensionName de l'événement, et l'heure système actuelle 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. Comme situation est une propriété complexe, elle est représentée par une classe Java spécialisée. Par conséquent, la définition de la propriété situation implique plusieurs étapes distinctes :
    1. Création d'un objet situation
    2. Utilisation de méthodes de définition pour peupler l'objet situation avec les données de propriété nécessaires
    3. Définition de la propriété situation de l'événement en appelant la méthode Event.setSituation() et en spécifiant l'objet situation peuplé
  4. Elle définit les valeurs de plusieurs autres propriétés event, obligatoires ou facultatives. Ces propriétés sont severity, msg, version et sourceComponentId.

    Remarque :

    Comme situation, sourceComponentId est également une propriété complexe. Cependant, ses propriétés enfants sont toutes des attributs simples représentés par des chaînes, afin que vous puissiez utiliser la méthode auxiliaire setSourceComponentId() au lieu d'instancier séparément un objet Java spécialisé.

    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, qui est maintenant peuplé avec les données de propriété.

Création du message de notification

La méthode suivante de l'exemple de source d'événements, createNotificationMessage(event), est une méthode auxiliaire permettant de créer un message de notification qui encapsule l'événement transmis comme paramètre à la méthode. Cette méthode est appelée par la méthode sendEvent pour créer le message de notification qui est envoyé 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 de rubrique appelé "Topic", avec 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 la rubrique de la notification
            notificationArray[i].setTopic(topicExpType);

            //Définition de l'événement qui doit être le message de la notification
            notificationArray[i].setMessage(events[i]);

            //Définition des informations du programme de génération de l'événement
            //de 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(event) exécute cette procédure :

  1. Elle crée un objet NotificationMessageHolderType, qui contient les informations de la notification à envoyer.
  2. L'élément de rubrique 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 de manière à être l'événement transmis à la méthode.
  4. Les informations relatives au programme de génération de l'événement sont définies dans la notification.
  5. Le message de notification ainsi créé et peuplé avec les informations est renvoyé à l'appelant.

Envoi de l'événement

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

    private void sendEvent() throws Exception {
        //Première étape de création d'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é spécifiée, le service Web est censé
            // s'exécuter sur l'hôte local sur le port 8080 pour Apache 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 d'objet CbeSerializer pour la
        // sérialisation des objets de type
        // CommonBaseEvent à envoyer sur le câble
        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() exécute cette procédure :

  1. Elle appelle la méthode auxiliaire createEvent() pour créer et peupler un nouvel événement.
  2. Elle appelle la méthode auxiliaire createNotificationMessage(event) pour créer un message de notification qui encapsule l'événement créé.
  3. Dans la propriété system, elle obtient l'adresse des services Web NotificationConsumer, qui servent la demande de notification.
  4. Elle instancie NotificationConsumerServiceLocator, qui est alors utilisé pour obtenir un objet NotificationConsumer.
  5. La classe CbeSerializerFactory est enregistrée comme magasin des sérialiseurs à utiliser pour sérialiser des objets du type CommonBaseEvent. CbeSerializerFactory renvoie une instance de l'objet CbeSerializer. Cet objet implémente la méthode sérialisée, qui convertit les objets CommonBaseEvent au format XML à envoyer sur le câble.
  6. Elle envoie l'événement en appelant la méthode notify() de NotificationConsumer. Cette opération génère un message SOAP, qui encapsule l'événement.


Rubriques connexes
Création des exemples
Exécution des exemples


Concepts associés
Conversion d'un événement au format Common Base Event au format d'événement Enterprise Console