Procedura dettagliata di esempio WS-Notification

L'esempio dell'origine di eventi è un codice di esempio per un produttore di notifica WS-Notification 1.0. Si basa sulle librerie dei progetti open source di Apache Axis e Eclipse TPTP.

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 EventSourceWsn10.java è disponibile nella directory <sdk_install_dir>/samples/wsnt-axis/src/com/wtci/samples/axis/source.

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

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;

Il metodo principale di EventSourceWsn10.java crea una nuova istanza di EventSourceWsn10 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 createEvents di EventSourceWsn10.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 createEvents 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 createEvents 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' e il valore dell'attributo
            //dialect come '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);

            //Impostazione di Topic della notifica
            notificationArray[i].setTopic(topicExpType);

            //Impostazione dell'evento come messaggio della notifica
            notificationArray[i].setMessage(events[i]);

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

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' ed il valore dell'attributo dialect come 'tec'.
  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[] notificationArray =
            createNotificationMessage(events);

        // Reperimento dell'indirizzo di NotificationConsumer10Service
        // Web Services
        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 8080 per axis
            endpoint = "http://localhost:8080/axis/services/NotificationConsumer10Soap";
        }

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

        //Creazione di un'istanza di NotificationConsumerServiceLocator
        NotificationConsumerService notifierSvc =
            new NotificationConsumerServiceLocator();

        //Utilizzo di NotificationConsumerService per ottenere l'oggetto
        // NotificationConsumer per il servizio
        NotificationConsumer notifier =
            notifierSvc.getNotificationConsumer10Soap(serviceURL);

        //Registrazione di un'istanza dell'oggetto CbeSerializer per serializzare
        // gli oggetti di tipo
        //CommonBaseEvent da inviare alla connessione
        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);

        //Invio della notifica
        notifier.notify(notificationArray);
    }

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. La classe CbeSerializer Factory viene registrata come produzione di serializzatori utilizzati per serializzare gli oggetti di tipo CommonBaseEvent. CbeSerializerFactory restituisce un'istanza dell'oggetto CbeSerializer. Questo oggetto implementa il metodo serialize che converte gli oggetti CommonBaseEvent in formato xml da inviare alla connessione.
  6. 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