Procedura dettagliata di esempio WS-Notification

L'esempio dell'origine di eventi, EventSource.java, è un semplice origine di eventi che invia un singolo evento prefissato in Web Services. Dimostra la seguente procedura a cui un'origine di evento deve attenersi:

  1. Reperimento di una produzione di eventi
  2. Creazione di un evento e inserimento con i dati richiesti
  3. Utilizzo di stub del client Web Services creati per inviare un evento

Il codice di origine per EventSource.java è disponibile nella directory <sdk_install_dir>/samples/wsnt-was/src/com/wtci/samples/was/source di SDK.

Questo esempio utilizza le classi di registrazione Hyades oltre alle classi generate dai file wsdl. Utilizzare le seguenti istruzioni import per accedere ai pacchetti richiesti:

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;

Il metodo principale di EventSource.java crea una nuova istanza di EventSource utilizzando il costruttore predefinito. Quindi richiama il metodo sendEvent privato, che contiene la logica del programma principale. Una volta restituito il metodo sendEvent, il metodo main() stampa il messaggio "Notification sent" sull'output standard.

    /**
     * Metodo principale per l'origine di eventi.
     *
     * @param args
     *            argomenti trasferiti dalla riga comandi
     */
    public static void main(String args[]) {
        EventSourceWsn10 source = new EventSourceWsn10();
        try {
            source.sendEvent();
            System.out.println("Notification sent");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

Creazione e inserimento dell'evento

Il metodo createEvent() di EventSource.java è un metodo di supporto utilizzato per creare un evento ed inserirlo con un gruppo minimo dei dati di proprietà. Questo metodo viene richiamato dal metodo sendEvent per creare l'evento che sarà inviato a Web Services.

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

        String cbeFile = System.getProperty("cbe.file");
        if (cbeFile != null) {
            events = EventFormatter.eventsFromCanonicalXMLDoc(cbeFile);
        } else {
            // Il primo passaggio accede alla produzione di eventi
            EventFactory eventFactory =
                EventFactoryFactory.createEventFactory();

            // Creazione di un evento con un nome estensione.
            CommonBaseEvent event = 
                eventFactory.createCommonBaseEvent("EVENT");
            event.setCreationTimeAsLong(System.currentTimeMillis());

            // Impostazione della descrizione di situation obbligatoria per l'evento.
            Situation situation = eventFactory.createSituation();
            situation.setCategoryName(Situation.REPORT_SITUATION_CATEGORY);
            situation.setReportSituation("INTERNAL", "Succeeded");
            event.setSituation(situation);

            // Impostazione dell'identificazione del componente obbligatorio per
            // l'origine di evento
            event.setSourceComponentId("Event Source",
                "source.EventSource",
                "createEvent()",
                "http://www.ibm.com/namespaces/autonomic/Tivoli/Samples",
                "Sample",
                "unknown",
                "hostname");

            // Impostazione della versione di Common Base Event
            event.setVersion("1.0.1");
            // Impostazione dei campi facoltativi
            event.setSeverity((short) 10);
            event.setMsg("Common Event Infrastructure Tutorial");

            events = new CommonBaseEvent[] { event };
        }

        return events;
    }

Il metodo createEvent effettua la seguente procedura:

  1. Utilizza il metodo createEventFactory() di EventFactoryFactory per creare un nuovo oggetto EventFactory
  2. Utilizza il metodo createCommonBaseEvent(String) della produzione di eventi per creare un nuovo oggetto di eventi (un'istanza di CommonBaseEvent). La stringa specificata ("EVENT") consente di impostare la proprietà extensionName dell'evento e l'ora del sistema corrente consente di impostare la proprietà creationTime.
  3. Imposta il valore della proprietà situation dell'evento. Poiché situation è una proprietà complessa, è rappresentata da una classe Java specializzata. Quindi, l'impostazione della proprietà situation richiede diversi passaggi separati:
    1. Creazione di un nuovo oggetto Situation
    2. Utilizzo dei metodi setter per inserire l'oggetto Situation con i dati di proprietà richiesti
    3. Impostazione della proprietà situation dell'evento richiamando il metodo Event.setSituation(), che specifica l'oggetto Situation inserito
  4. Imposta i valori delle altre diverse proprietà di eventi, alcuni richiesti ed altri facoltativi. Queste proprietà includono severity, msg, version e sourceComponentId.
    Nota: come situation, sourceComponentId è una proprietà complessa. Tuttavia, le proprietà secondarie sono semplici attributi rappresentati da stringhe, quindi è possibile utilizzare il metodo di supporto setSourceComponentId() piuttosto che l'inizializzazione separata di un oggetto Java specializzato.

    Le altre proprietà impostate dall'esempio (version, severity e msg) sono semplici proprietà rappresentate da stringhe o valori interi.

  5. Infine, il metodo createEvent() restituisce l'evento, che è inserito con i dati di proprietà.

Creazione del messaggio di notifica

Il metodo successivo dell'esempio dell'origine di eventi, createNotificationMessage(event), è un metodo di supporto utilizzato per creare il messaggio di notifica che racchiude l'evento trasferito come parametro al metodo. Questo metodo viene richiamato dal metodo sendEvent per creare il messaggio di notifica che sarà inviato a Web Services.

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

            //Creazione di un'istanza di NotificationMessageHolderType
            notificationArray[i] = new NotificationMessageHolderType();

            //Creazione di un elemento Topic con il nome '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);

            //Impostazione dell'evento come messaggio della notifica
            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);

            //Impostazione delle informazioni sul produttore dell'evento nella
            //notifica
            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;
    }

Il metodo createNotificationMessage(event) effettua la seguente procedura:

  1. Crea un oggetto NotificationMessageHolderType che gestisce le informazioni della notifica da inviare.
  2. L'elemento Topic della notifica viene creato con il nome 'Topic'. Un elemento secondario nidificato è aggiunto per mostrare che gli elementi interni all'elemento Topic saranno ignorati quando viene ricevuta la notifica.
  3. Il messaggio della notifica è impostato come evento trasferito al metodo.
  4. Le informazioni sul produttore dell'evento sono impostate nella notifica.
  5. Il messaggio di notifica, quindi creato e inserito con le informazioni, viene restituito al chiamante.

Invio di eventi

L'ultimo metodo dell'esempio per l'origine di eventi, sendEvent(), contiene la logica di programma principale. Questo metodo gestisce tutte le interazioni con il client NotificationConsumer, incluso l'invio dell'evento.

    private void sendEvent() throws Exception {
        //Il primo passaggio è la creazione di un evento
        CommonBaseEvent[] events = createEvents();

        //Creazione del messaggio di notifica che racchiude l'evento
        NotificationMessageHolderType[] notification =
            createNotificationMessage(events);

        //Reperimento dell'indirizzo di NotificationConsumerService webservice
        String endpoint = System.getProperty("service.address");
        if (endpoint == null) {
            // Se non è stato specificato alcun indirizzo, è previsto che webservice sia eseguito
            // nell'host locale sulla porta 9080 per was
            endpoint = "http://localhost:9080/wsnt-was/services/NotificationConsumer10Soap";
        }

        //Creazione di un oggetto URL per l'indirizzo ottenuto
        java.net.URL serviceURL = new URL(endpoint);

        //Creazione di un'istanza di NotificationConsumerServiceLocator
        NotificationConsumerService notifierSvc =
            new NotificationConsumerServiceLocator();
        NotificationConsumer notifier =
            notifierSvc.getNotificationConsumer10Soap(serviceURL);

        //Invio della notifica
        notifier.notify(notification);

    }

Il metodo sendEvent() effettua la seguente procedura:

  1. Richiama il metodo di supporto createEvent() per creare ed inserire un nuovo evento.
  2. Richiama il metodo di supporto createNotificationMessage(event) per creare un messaggio di notifica che racchiude l'evento creato.
  3. Dalla proprietà del sistema, ottiene l'indirizzo di NotificationConsumer Web Services, che serve la richiesta di notifica.
  4. Avvia NotificationConsumerServiceLocator, che viene quindi utilizzato per ottenere un oggetto NotificationConsumer
  5. Invia l'evento richiamando il metodo notify() di NotificationConsumer. Genera un messaggio SOAP che racchiude l'evento


Argomenti correlati
Creazione degli esempi
Esecuzione degli esempi


Concetti correlati
Conversione di un evento in formato Common Base Event in formato dell'evento di Enterprise Console