Walkthrough für WS-Notification-Beispiele

Das Beispiel der Ereignisquelle ist ein Mustercode für einen WS-Notification 1.0-Hinweisproduzenten. Es hängt von Bibliotheken von den Open Source-Projekten von Apache Axis und Eclipse TPTP ab.

Es demonstriert die folgenden Schritte, die eine Ereignisquelle befolgen muss:

  1. Ereignisfactory abrufen
  2. Ereignis erstellen und es mit den erforderlichen Daten ausfüllen
  3. Stubs auf der Clientseite der generierten Web-Services verwenden, um ein Ereignis zu senden

Der Quellcode für 'EventSourceWsn10.java' ist im Verzeichnis <sdk_install_dir>/samples/wsnt-axis/src/com/wtci/samples/axis/source verfügbar.

In diesem Beispiel werden mehrere Apache Axis-Klassen, Eclipse Hyades-Protokollierungsklassen sowie Klassen verwendet, die von den wsdl-Dateien generiert werden. Machen Sie von den folgenden Importanweisungen Gebrauch, um auf die erforderlichen Pakete zuzugreifen:

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;

Die Methode main von 'EventSourceWsn10.java' erstellt mit dem Standardkonstruktor eine neue Instanz von 'EventSourceWsn10'. Sie ruft dann die Methode 'private sendEvent()' auf, welche die Logik des Hauptprogramms enthält. Nach Rückgabe der Methode 'sendEvent()' gibt die Methode 'main()' die Nachricht "Notification sent" (Hinweis gesendet) in der Standardausgabe aus.

    /**
     * Hauptmethode für die Ereignisquelle.
     *
     * @param args
     *            Argumente, die von der Befehlszeile übergeben werden
     */
    public static void main(String args[]) {
        EventSourceWsn10 source = new EventSourceWsn10();
        try {
            source.sendEvent();
            System.out.println("Notification sent");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

Ereignis erstellen und ausfüllen

Die Methode createEvents von 'EventSourceWsn10.java' ist eine Unterstützungsmethode, die verwendet wird, um ein Ereignis zu erstellen und es mit einer minimalen Menge an Eigenschaftsdaten auszufüllen. Diese Methode wird von der Methode sendEvent aufgerufen, um das Ereignis zu erstellen, das an die Web-Services gesendet wird.

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

        String cbeFile = System.getProperty("cbe.file");
        if (cbeFile != null) {
            events = EventFormatter.eventsFromCanonicalXMLDoc(cbeFile);
        } else {
            // Der erste Schritt ist der Zugriff auf die Ereignisfactory
            EventFactory eventFactory =
                EventFactoryFactory.createEventFactory();

            // Erstellen eines Ereignisses mit einer Erweiterung.
            CommonBaseEvent event = 
                eventFactory.createCommonBaseEvent("EVENT");
            event.setCreationTimeAsLong(System.currentTimeMillis());

            // Festlegen einer obligatorischen Situationsbeschreibung für das Ereignis.
            Situation situation = eventFactory.createSituation();
            situation.setCategoryName(Situation.REPORT_SITUATION_CATEGORY);
            situation.setReportSituation("INTERNAL", "Succeeded");
            event.setSituation(situation);

            // Festlegen der obligatorischen Komponentenidentifikation für die
            // Ereignisquelle
            event.setSourceComponentId("Event Source",
                "source.EventSource",
                "createEvent()",
                "http://www.ibm.com/namespaces/autonomic/Tivoli/Samples",
                "Sample",
                "unknown",
                "hostname");

            // Festlegen der Common Base Event-Version
            event.setVersion("1.0.1");
            // Festlegen optionaler Felder
            event.setSeverity((short) 10);
            event.setMsg("Common Event Infrastructure Tutorial");

            events = new CommonBaseEvent[] { event };
        }

        return events;
    }

Die Methode createEvents führt die folgenden Schritte aus:

  1. Es verwendet die Methode 'createEventFactory()' von 'EventFactoryFactory ', um ein neues EventFactory-Objekt zu erstellen.
  2. Es erstellt mit der Methode 'createCommonBaseEvent(String)' der Ereignisfactory ein neues Ereignisobjekt (eine Instanz von 'CommonBaseEvent'). Die angegebene Zeichenfolge ("EVENT") wird verwendet, um die Eigenschaft extensionName des Ereignisses einzustellen, und mit der aktuellen Systemzeit wird die Eigenschaft creationTime festgelegt.
  3. Es wird der Wert der Eigenschaft situation des Ereignisses eingestellt. Da situation eine komplexe Eigenschaft ist, wird sie von einer angepassten Java-Klasse repräsentiert. Aus diesem Grund sind bei der Einstellung der Eigenschaft situation mehrere Einzelschritte erforderlich:
    1. Neues Situation-Objekt erstellen
    2. Mit Setter-Methoden das Situation-Objekt mit den erforderlichen Eigenschaftsdaten ausfüllen
    3. Die Eigenschaft situation des Ereignisses durch Aufrufen der Methode 'Event.setSituation()' einstellen, indem das ausgefüllte Situation-Objekt angegeben wird
  4. Es werden die Werte von mehreren anderen Ereigniseigenschaften eingestellt, von denen einige erforderlich und andere optional sind. Zu diesen Eigenschaften gehören severity, msg, version, und sourceComponentId.

    Hinweis:

    Genauso wie situation ist auch sourceComponentId eine komplexe Eigenschaft. Ihre untergeordneten Eigenschaften sind jedoch alle einfache Attribute, die von Zeichenfolgen dargestellt werden, damit Sie die Unterstützungsmethode 'setSourceComponentId()' verwenden können und nicht ein angepasstes Java-Objekt separat instantiieren müssen.

    Die anderen Eigenschaften, die vom Beispiel eingestellt werden (version, severity und msg), sind alle einfache Eigenschaften, die von Zeichenfolgen oder ganzen Zahlen dargestellt werden.

  5. Zum Schluss gibt die Methode createEvents das Ereignis zurück, das nun mit Eigenschaftsdaten ausgefüllt wird.

Hinweisnachricht erstellen

Die nächste Methode des Ereignisquellenbeispiels - 'createNotificationMessage(event)' - ist eine Unterstützungsmethode, mit der eine Hinweisnachricht erstellt wird, welche das Ereignis einbindet, das als Parameter an die Methode übergeben wurde. Diese Methode wird von der Methode 'sendEvent' aufgerufen, um die Hinweisnachricht zu erstellen, die an die Web-Services gesendet wird.

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

            //Erstellen einer Instanz von 'NotificationMessageHolderType'
            notificationArray[i] = new NotificationMessageHolderType();

            //Erstellen eines Themenelements mit dem Namen 'Topic' und dem Wert des
            //Programmversionattributs als '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);

            //Festlegen des Themas des Hinweises
            notificationArray[i].setTopic(topicExpType);

            //Festlegen des Ereignisses als Nachricht des Hinweises
            notificationArray[i].setMessage(events[i]);

            //Festlegen der Informationen zum Produzenten des Ereignisses im
            //Hinweis
            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;
    }

Die Methode 'createNotificationMessage(event)' führt die folgenden Schritte aus

  1. Sie erstellt ein NotificationMessageHolderType-Objekt, das die Informationen zum Hinweis enthält, der gesendet werden soll.
  2. Das Themenelement des Hinweises wird mit dem Namen 'Topic' und dem Programmversionwert als 'tec' erstellt.
  3. Die Nachricht des Hinweises wird als Ereignis festgelegt, das an die Methode übergeben wird.
  4. Die Informationen zum Produzenten des Ereignisses werden im Hinweis festgelegt.
  5. Die Hinweisnachricht, die infolgedessen erstellt und mit Daten ausgefüllt wird, wird an das aufrufende Programm zurückgegeben.

Ereignis senden

Die letzte Methode des Ereignisquellenbeispiels - 'sendEvent()' - enthält die Logik des Hauptprogramms. Diese Methode handhabt sämtliche Interaktionen mit dem NotificationConsumer-Client, einschließlich dem Senden des Ereignisses.

    private void sendEvent() throws Exception {
        //Der erste Schritt ist das Erstellen eines Ereignisses
        CommonBaseEvent[] events = createEvents();

        //Erstellen der Hinweisnachricht, die das Ereignis einbindet
        NotificationMessageHolderType[] notificationArray =
            createNotificationMessage(events);

        // Abrufen der Adresse der NotificationConsumer10Service-
        // Web-Services
        String endpoint = System.getProperty("service.address");
        if (endpoint == null) {
            //Wenn keine Adresse angegeben wurde, wird angenommen, dass der Web-Service
            // im lokalen Host unter Port 8080 für Axis ausgeführt wird
            endpoint = "http://localhost:8080/axis/services/NotificationConsumer10Soap";
        }

        //Erstellen eines URL-Objekts für die erhaltene Adresse
        URL serviceURL = new URL(endpoint);

        //Erstellen einer Instanz von 'NotificationConsumerServiceLocator'
        NotificationConsumerService notifierSvc =
            new NotificationConsumerServiceLocator();

        //Mit Hilfe von 'NotificationConsumerService'
        // NotificationConsumer-Objekt für den Dienst abrufen
        NotificationConsumer notifier =
            notifierSvc.getNotificationConsumer10Soap(serviceURL);

        //Registrieren einer Instanz des CbeSerializer-Objekts für Serialisierung von
        // Objekten des
        //Typs 'CommonBaseEvent', die über die Leitung geschickt werden sollen
        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);

        //Senden des Hinweises
        notifier.notify(notificationArray);
    }

Die Methode 'sendEvent()' führt die folgenden Schritte aus:

  1. Es wird die Unterstützungsmethode 'createEvent()' aufgerufen, um ein neues Ereignis zu erstellen und auszufüllen.
  2. Es wird die Unterstützungsmethode 'createNotificationMessage(event)' aufgerufen, um eine Hinweisnachricht zu erstellen, die das erstellte Ereignis einbindet.
  3. Von der Systemeigenschaft wird die Adresse der NotificationConsumer-Web-Services abgerufen, welche die Hinweisanforderung verarbeiten.
  4. Es wird 'NotificationConsumerServiceLocator' instantiiert, wonach dann ein NotificationConsumer-Objekt abgerufen wird.
  5. Die Factory-Klasse 'CbeSerializer' wird als eine Factory von Serialisierern registriert, mit der Objekte des Typs 'CommonBaseEvent' serialisiert werden. 'CbeSerializerFactory' gibt eine Instanz des CbeSerializer-Objekts zurück. Dieses Objekt implementiert die Serialisierungsmethode, die CommonBaseEvent-Objekte in das XML-Format konvertiert, um sie über die Leitung zu schicken.
  6. Das Ereignis wird gesendet, indem die Methode 'notify()' von 'NotificationConsumer' aufgerufen wird. Dadurch wird eine SOAP-Nachricht generiert, die das Ereignis einbindet.


Verwandte Themen
Beispiele erstellen
Beispiele ausführen


Zugehörige Konzepte
Ereignis im Common Base Event-Format in das Enterprise Console-Ereignisformat konvertieren