Passo a Passo de Amostras do WS-Notification

O exemplo da fonte de eventos é um código de amostra de um produtor de notificação do WS-Notification 1.0. Ele conta com as bibliotecas do Apache Axis e os projetos de código aberto do Eclipse TPTP.

Ele demonstra as seguintes etapas que uma fonte de eventos deve seguir:

  1. Obtendo um depósito de informações do provedor do evento
  2. Criando um evento e preenchendo-o com os dados necessários
  3. Utilizando os Serviços da Web gerados nos stubs do lado cliente para enviar um evento

O código fonte do EventSourceWsn10.java está disponível no diretório <sdk_install_dir>/samples/wsnt-axis/src/com/wtci/samples/axis/source.

Este exemplo utiliza várias classes Apache Axis, classes de log Eclipse Hyades, bem como classes geradas a partir dos arquivos wsdl. Utilize as seguintes instruções de importação para acessar os pacotes necessários:

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;

O método main do EventSourceWsn10.java cria uma nova instância de EventSourceWsn10 utilizando o construtor padrão. Ele chama então o método sendEvent() privado, que contém a lógica do programa principal. Depois que o método sendEvent() retorna, o método main() imprime a mensagem "Notificação enviada" na saída padrão.

    /**
     * Método principal da fonte de eventos.
     *
     * @param args
     *            argumentos transmitidos a partir da linha de comandos
     */
    public static void main(String args[]) {
        EventSourceWsn10 source = new EventSourceWsn10();
        try {
            source.sendEvent();
            System.out.println("Notificação enviada");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

Criando e Preenchendo o Evento

O método createEvents do EventSourceWsn10.java é um método do assistente utilizado para criar um evento e preenchê-lo com um conjunto mínimo de dados de propriedade. Esse método é chamado pelo método sendEvent para criar o evento que será enviado aos Serviços da Web.

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

        String cbeFile = System.getProperty("cbe.file");
        if (cbeFile != null) {
            events = EventFormatter.eventsFromCanonicalXMLDoc(cbeFile);
        } else {
            // A primeira etapa é acessar o depósito de informações do provedor do evento
            EventFactory eventFactory =
                EventFactoryFactory.createEventFactory();

            // Criando um evento com um nome de extensão.
            Evento CommonBaseEvent =
                eventFactory.createCommonBaseEvent("EVENT");
            event.setCreationTimeAsLong(System.currentTimeMillis());

            // Definindo a descrição obrigatória da situação do evento.
            Situation situation = eventFactory.createSituation();
            situation.setCategoryName(Situation.REPORT_SITUATION_CATEGORY);
            situation.setReportSituation("INTERNA", "Bem-sucedida");
            event.setSituation(situation);

            // Definindo a identificação obrigatória do componente da
            // fonte de eventos
            event.setSourceComponentId("Fonte de Eventos",
                "source.EventSource",
                "createEvent()",
                "http://www.ibm.com/namespaces/autonomic/Tivoli/Samples",
                "Sample",
                "unknown",
                "hostname");

            // Definindo a versão do Evento de Base Comum
            event.setVersion("1.0.1");
            // Definindo os campos opcionais
            event.setSeverity((short) 10);
            event.setMsg("Tutorial da Infra-estrutura de Eventos Comuns");

            events = new CommonBaseEvent[] { event };
        }

        retornar eventos;
    }

O método createEvents executa as seguintes etapas:

  1. Utiliza o método createEventFactory() do EventFactoryFactory para criar um novo objeto EventFactory
  2. Utiliza o método createCommonBaseEvent(String) do depósito de informações do provedor do evento para criar um novo objeto de evento (uma instância de CommonBaseEvent). A cadeia especificada ("EVENT") é utilizada para definir a propriedade extensionName do evento e a hora atual do sistema é utilizada para definir a propriedade creationTime.
  3. Define o valor da propriedade situation do evento. Como situation é uma propriedade complexa, ela é representada por uma classe Java especializada. Portanto, a definição da propriedade situation requer várias etapas separadas:
    1. Criando um Novo Objeto Situation
    2. Utilizando métodos do definidor para preencher o objeto Situation com os dados de propriedade requeridos
    3. Definindo a propriedade situation do evento chamando o método Event.setSituation(), especificando o objeto Situation preenchido
  4. Ela define os valores de várias outras propriedades de eventos, algumas obrigatórias e outras opcionais. Essas propriedades incluem gravidade, msg, versão e sourceComponentId.

    Nota:

    Da mesma forma que situation, sourceComponentId também é uma propriedade complexa. Entretanto, suas propriedades filhas são todos atributos simples representados por cadeias, para que você possa utilizar o método do assistente setSourceComponentId() em vez de instanciar separadamente um objeto Java especializado.

    As outras propriedades definidas pelo exemplo (versão, gravidade e msg) são todas propriedades simples representadas por cadeias ou inteiros.

  5. Finalmente, o método createEvents retorna o evento, que é agora preenchido com dados de propriedade.

Criando a Mensagem de Notificação

O próximo método do exemplo de fonte de eventos, createNotificationMessage(event), é um método do assistente utilizado para criar mensagem de notificação que encapsula o evento transmitido como parâmetro para o método. Esse método é chamado pelo método sendEvent para criar a mensagem de notificação que será enviada aos Serviços da Web.

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

            //Criando uma instância de NotificationMessageHolderType
            notificationArray[i] = new NotificationMessageHolderType();

            //Criando um elemento Tópico com o nome 'Tópico' e o valor
            //do atributo dialeto como 'tec'
            MessageElement[] msgTopic = new MessageElement[1];
            msgTopic[0] = new MessageElement();
            msgTopic[0].setName("Tópico");
            msgTopic[0].setAttribute("dialeto", "nenhum");
            TopicExpressionType topicExpType = new TopicExpressionType();
            topicExpType.set_any(msgTopic);

            //Definindo o Tópico da notificação
            notificationArray[i].setTopic(topicExpType);

            //Definindo o evento para ser a mensagem da notificação
            notificationArray[i].setMessage(events[i]);

            //Definindo informações sobre o produtor do evento na
            //notificação
            EndpointReferenceType endPointRef = new EndpointReferenceType();
            AttributedURI au = new AttributedURI();
            URI value = new URI("protocolo", "your.event.source.address");
            au.set_value(value);
            endPointRef.setAddress(au);
            notificationArray[i].setProducerReference(endPointRef);
        }

        retornar notificationArray;
    }

O createNotificationMessage(event) executa as seguintes etapas

  1. Cria um objeto NotificationMessageHolderType que contém informações da notificação a ser enviada.
  2. O elemento Tópico da notificação é criado com o nome 'Tópico' e o valor de atributo dialeto como 'tec'.
  3. A mensagem da notificação é definida para ser o evento transmitido para o método.
  4. As informações sobre o produtor do evento são definidas na notificação.
  5. A mensagem de notificação, criada e preenchida de acordo com as informações, é retornada ao responsável pela chamada.

Enviando Evento

O último método do exemplo da fonte de eventos, sendEvent(), contém a lógica do programa principal. Este método manipula toda a interação com o cliente NotificationConsumer, incluindo o envio do evento.

    private void sendEvent() throws Exception {
        //A primeira etapa é criar um evento
        CommonBaseEvent[] events = createEvents();

        //Criando a mensagem de notificação que encapsula o evento
        NotificationMessageHolderType[] notificationArray =
            createNotificationMessage(events);

        // Obtendo o endereço dos Serviços da Web do
        // NotificationConsumer10Service
        String endpoint = System.getProperty("service.address");
        if (endpoint == null) {
            //Se nenhum endereço foi especificado, supõe-se que o serviço da Web esteja
            // em execução no host local na porta 8080 do eixo
            endpoint = "http://localhost:8080/axis/services/NotificationConsumer10Soap";
        }

        //Criando um objeto URL para o endereço obtido
        URL serviceURL = new URL(endpoint);

        //Criando uma instância do NotificationConsumerServiceLocator
        NotificationConsumerService notifierSvc =
            new NotificationConsumerServiceLocator();

        //Utilizando o NotificationConsumerService para obter
        // o objeto NotificationConsumer para o serviço
        NotificationConsumer notifier =
            notifierSvc.getNotificationConsumer10Soap(serviceURL);

        //Registrando uma instância do objeto CbeSerializer para serializar
        // objetos do
        //tipo CommonBaseEvent a ser enviado pela ligação
        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);

        //Enviando a notificação
        notifier.notify(notificationArray);
    }

O método sendEvent() executa as seguintes etapas:

  1. Chama o método do assistente createEvent() para criar e preencher um novo evento.
  2. Chama o método do assistente createNotificationMessage(event) para criar uma mensagem de notificação que encapsula o evento criado.
  3. Na propriedade do sistema, ele obtém o endereço dos Serviços da Web do NotificationConsumer, atendendo ao pedido de notificação.
  4. Ele instancia o NotificationConsumerServiceLocator, que é então utilizado para obter um objeto NotificationConsumer
  5. A classe do Depósito de Informações do Provedor CbeSerializer é registrada como um depósito de informações do provedor de serializadores a serem utilizados para serializar objetos do tipo CommonBaseEvent. O CbeSerializerFactory retorna uma instância de objeto CbeSerializer. Esse objeto implementa o método serializar que converte objetos CommonBaseEvent no formato xml a ser enviado pela ligação.
  6. Envia o evento chamando o método notify() do NotificationConsumer. Isso gera uma mensagem SOAP que encapsula o evento


Tópicos Relacionados
Construindo as Amostras
Executando as Amostras


Conceitos Relacionados
Convertendo um Evento no Formato Evento de Base Comum para o Formato de Evento do Console Corporativo