Exemplo: Efetuando Assinatura de um Consumidor do WS-Notification
Use esta tarefa para gravar o código de um cliente JAX-RPC usando a função de registro do publicador, registrando um aplicativo (produtor) do publicador com um broker, com base na extração do código de exemplo fornecida.
Sobre Esta Tarefa
Esse exemplo é baseado no uso de APIs Java™ API for XML-based remote procedure calls (JAX-RPC) com código gerado usando a ferramenta WSDL2Java (executada com relação ao WSDL do Broker de Notificação gerado como resultado da criação do ponto de serviço WS-Notification) e as APIs e SPIs do WebSphere Application Server.
- JAX-WS
- Modelo de Programação de Cliente JAX-WS
- Implementando Clientes de Serviços da Web JAX-WS Estáticos
- Gravando Aplicativos JAX-WS para o WS-Notification
- Sugestões e Dicas para Serviços da Web: JAX-RPC versus JAX-WS, Parte 1
Neste exemplo, o primeiro bloco de código opcional mostra como criar uma assinatura não processada. Este conceito é definido na seção 4.2 da Especificação de Notificação Base de Serviços da Web.
No caso normal, uma assinatura agrupada faz com que a operação Notificar do NotificationConsumer seja acionada quando notificações de eventos correspondentes tornam-se disponíveis. Se o Assinante em vez disso, criar uma assinatura não processada, apenas o conteúdo específico do aplicativo da notificação de eventos (isto é, o conteúdo do elemento NotificationMessage) será enviado ao terminal do consumidor de destino. Observe que o terminal da web em serviço especificado na ConsumerReference da solicitação Subscribe que também especifica UseRaw (ou seja uma solicitação de assinatura não processada) não precisa implementar o tipo de porta NotificationConsumer, porque a operação Notificar não será usada para entrega r notificações de eventos.
Isso significa que o consumidor deve poder aceitar operações para cada um dos tipos de conteúdo do aplicativo que será publicado no tópico especificado. Essa padrão permite que o WS-Notification chame um grupo de aplicativos de serviços da web existentes que não reconhecem o WS-Notification, mas que desejam receber as mesmas informações.
O JAX-WS suporta despacho com base em ação e os aplicativos consumidores brutos JAX-WS devem aceitar o URI de ação http://docs.oasis-open.org/wsn/bw-2/NotificationConsumer/Notify. Para obter informações adicionais, consulte a dica de resolução de problemas Um aplicativo JAX-WS, que é um consumidor bruto das notificações processadas pelo intermediário, deve reconhecer uma ação SOAP do broker de notificação.
Para gravar o código de um cliente JAX-RPC que atua na função de registro do publicador, registrando um aplicativo (produtor) do publicador com um broker, conclua as etapas a seguir, consultando a extração do código de exemplo para obter informações adicionais.
Procedimento
Exemplo
// Look up the JAX-RPC service. The JNDI name is specific to your web services client implementation
InitialContext context = new InitialContext();
javax.xml.rpc.Service service = (javax.xml.rpc.Service) context.lookup(
"java:comp/env/services/NotificationBroker");
// Get a stub for the port on which you want to invoke operations
NotificationBroker stub = (NotificationBroker) service.getPort(NotificationBroker.class);
// Create the ConsumerReference. This contains the address of the consumer web service that is being
// subscribed, or alternatively is a reference to a pull point (see alternative below). Specifying a
// pull point EPR indicates that the consumer is to use pull-based notifications.
EndpointReference consumerEPR =
EndpointReferenceManager.createEndpointReference(new URI("http://myserver.mycom.com:9080/Consumer"));
/*
// ConsumerReference alternativa para notificações baseadas em solicitações.
EndpointReference consumerEPR = pullPointEPR;
*/
// Criar o Filtro. Fornece o nome do tópico para o qual você deseja efetuar assinatura do consumidor
Filter filter = new Filter();
// Criar uma expressão de tópico e incluí-la no filtro. Os prefixMappings são mapeamentos entre prefixos
// de espaços de nomes e seus espaços de nomes correspondentes para prefixos utilizados na expressão
Map prefixMappings = new HashMap();
prefixMappings.put("abc", "uri:example");
TopicExpression exp =
new TopicExpression(TopicExpression.SIMPLE_TOPIC_EXPRESSION, "abc:ExampleTopic", prefixMappings);
filter.addTopicExpression(exp);
//Create an XPath 1.0 message content filter
//This example selects a subset of the available messages in the topic, based upon salary level
String filterExpression = "/company/department/employee/salary > 10000";
URI xpathURI = new URI(http://www.w3.org/TR/1999/REC-xpath-19991116);
QueryExpression qexp =
new QueryExpression(xpathURI, filterExpression);
filter.addMessageContentExpression(qexp);
// Create the InitialTerminationTime. This is the time when you want the subscription to terminate.
// For example, set a time of 1 year in the future.
Calendar cal = Calendar.getInstance();
cal.add(Calendar.YEAR, 1);
AbsoluteOrRelativeTime initialTerminationTime = new AbsoluteOrRelativeTime(cal);
// Create the Policy information
SOAPElement[] policyElements = null;
/*
Optional
--------
The following lines show how to construct a policy indicating that the consumer is to
receive raw style notifications:
javax.xml.soap.SOAPFactory soapFactory = javax.xml.soap.SOAPFactory.newInstance();
SOAPElement useRawElement = null;
if (soapFactory instanceof IBMSOAPFactory) {
// Você pode utilizar os métodos de inclusão de valores fornecidos pela API IBMSOAPFactory para criar o SOAPElement
// a partir de uma cadeia XML.
String useRawElementXML = "<mno:UseRaw xmlns:mno=\"http://docs.oasis-open.org/wsn/b-2\"/>";
useRawElement = ((IBMSOAPFactory) soapFactory).createElementFromXMLString(useRawElementXML);
} else {
useRawElement = soapFactory.createElement("UseRaw", "mno", "http://docs.oasis-open.org/wsn/b-2");
}
policyElements = new SOAPElement[] { useRawElement };
*/
// Criar portadores para conter os diversos valores retornados do intermediário:
// A referência da assinatura
EndpointReferenceTypeHolder subscriptionRefHolder = new EndpointReferenceTypeHolder();
// A hora atual no intermediário
CalendarHolder currentTimeHolder = new CalendarHolder();
// A hora de término para a assinatura
CalendarHolder terminationTimeHolder = new CalendarHolder();
// Quaisquer elementos adicionais
AnyArrayHolder anyOtherElements = new AnyArrayHolder();
// Chamar a operação Subscribe chamando o método associado no stub
stub.subscribe(consumerEPR,
filter,
initialTerminationTime,
policyElements,
anyOtherElements,
subscriptionRefHolder,
currentTimeHolder,
terminationTimeHolder);
// Obter os valores retornados:
// Uma referência do terminal para a assinatura que foi criada. É requerida para
// gerenciamento de existência subseqüente da assinatura, por exemplo, pausar a assinatura
com.ibm.websphere.wsaddressing.EndpointReference subscriptionRef = subscriptionRefHolder.value;
// A hora atual no intermediário
Calendar currentTime = currentTimeHolder.value;
// A hora de término da assinatura
Calendar terminationTime = terminationTimeHolder.value;
// Quaisquer outras informações
SOAPElement[] otherElements = anyOtherElements.value;