Walkthrough für WS-Notification-Beispiele

Das Ereignisquellenbeispiel, 'EventSource.java', ist eine einfache Ereignisquelle, die ein einzelnes fest codiertes Ereignis an die Web-Services sendet. 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 'EventSource.java' ist im Verzeichnis <sdk_install_dir>/samples/wsnt-was/src/com/wtci/samples/was/source des SDK verfügbar.

In diesem Beispiel werden 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.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;

Die Methode main von 'EventSource.java' erstellt mit dem Standardkonstruktor eine neue Instanz von 'EventSource'. Sie ruft dann die nicht öffentliche Methode 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 'createEvent()' von 'EventSource.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 createEvent 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 'createEvent()' 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'
            SOAPFactory soapFactory = new SOAPFactory();
            SOAPElement topicSE = (SOAPElement)
                soapFactory.createElement("Topic");
            SOAPElement topicSEChild = (SOAPElement)
                topicSE.addChildElement("Topic");
            topicSEChild.setAttribute("dialect","none");
            notificationArray[i].setTopic(topicSE);

            //Festlegen des Ereignisses als Nachricht des Hinweises
            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);

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

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' erstellt. Ein verschachteltes untergeordnetes Element wird hinzugefügt, um anzuzeigen, dass alles im Themenelement ignoriert wird, wenn der Hinweis empfangen wird.
  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[] notification =
            createNotificationMessage(events);

        //Abrufen der Adresse des NotificationConsumerService-Web-Service
        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 9080 für 'was' ausgeführt wird
            endpoint = "http://localhost:9080/wsnt-was/services/NotificationConsumer10Soap";
        }

        //Erstellen eines URL-Objekts für die abgerufene Adresse
        java.net.URL serviceURL = new URL(endpoint);

        //Erstellen einer Instanz von 'NotificationConsumerServiceLocator'
        NotificationConsumerService notifierSvc =
            new NotificationConsumerServiceLocator();
        NotificationConsumer notifier =
            notifierSvc.getNotificationConsumer10Soap(serviceURL);

        //Senden des Hinweises
        notifier.notify(notification);

    }

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. 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