Ejemplo: Cómo suscribir un consumidor de WS-Notification

Utilice esta tarea para escribir el código para un cliente JAX-RPC que actúa en el rol de registro del editor y registra una aplicación de editor (generador) con un intermediario, según el fragmento del código de ejemplo proporcionado.

Acerca de esta tarea

Este ejemplo se basa en el uso de las API Java™ para las API de llamadas de procedimiento remoto basadas en XML (JAX-RPC) con el código generado mediante la herramienta WSDL2Java (se ejecuta en el WSDL del intermediario de notificaciones generado como resultado de crear el punto de servicio de WS-Notification) y las API y SPI de WebSphere Application Server.

En WebSphere Application Server hay dos implementaciones del servicio WS-Notification: la Versión 6.1 y la Versión 7.0. Este ejemplo de JAX-RPC puede interactuar satisfactoriamente con los puntos de servicio WS-Notification Versión 6.1 o Versión 7.0. Sin embargo, si desea utilizar WS-Notification con conjuntos de políticas, por ejemplo para habilitar la integración con WS-ReliableMessaging, las aplicaciones WS-Notification deben codificarse para utilizar el modelo de programación JAX-WS (API de Java para servicios web XML) y deben interactuar con los puntos de servicio WS-Notification Versión 7.0. Si no está familiarizado con la programación de aplicaciones cliente JAX-WS, consulte los temas siguientes: El artículo Escritura de aplicaciones JAX-WS para WS-Notification también incluye un ejemplo de un aplicación de cliente de suscriptor JAX-WS.
Suscripciones sin procesar:

En este ejemplo, el primer bloque de códigos opcional muestra cómo crear una suscripción sin procesar. Este concepto está definido en el apartado 4.2 de la especificación de notificación base de servicios web.

Lo normal es que una suscripción envuelta cause que se controle la operación de notificación de NotificationConsumer cuando las notificaciones de sucesos coincidentes queden disponibles. Si, en cambio, el suscriptor crea una suscripción sin procesar, sólo el contenido específico de la aplicación de la notificación de sucesos (es decir, el contenido del elemento NotificationMessage) se envía al punto final del consumidor de destino. Tenga en cuenta que el punto final de servicio web especificado en ConsumerReference de la solicitud de suscripción que también especifica UseRaw (es decir, una solicitud de suscripción sin procesar) no tiene que implementar el tipo de puerto de NotificationConsumer porque la operación de notificación no se utilizará para entregar notificaciones de sucesos.

Esto quiere decir que el consumidor debe poder aceptar operaciones para cada uno de los tipos de contenido de aplicación que se publicarán en el tema especificado. Este patrón permite que WS-Notification invoque un grupo de aplicaciones de servicios web existentes que no es compatible con WS-Notification, pero que desea recibir la misma información.

JAX-WS admite la asignación basada en acción y las aplicaciones de consumidor JAX-WS deben aceptar el identificador de recursos uniforme (URI) de acción http://docs.oasis-open.org/wsn/bw-2/NotificationConsumer/Notify. Si desea más información, consulte los consejos de resolución de problemas Una aplicación JAX-WS que es un consumidor de notificaciones de intermediario debe reconocer una acción SOAP de intermediario de notificación..

Para escribir el código para un cliente JAX-RPC que actúa en el rol de registro del editor y registra una aplicación de editor (generador) con un intermediario, realice los pasos siguientes, consultando el fragmento de código de ejemplo para obtener más información.

Procedimiento

  1. Busque el servicio JAX-RPC. El nombre JNDI es específico a su implementación de cliente de servicios web.
  2. Obtenga un archivo de apéndice (stub) para el puerto en el que desea invocar las operaciones
  3. Cree la ConsumerReference. Esta contiene la dirección del servicio web del consumidor al que se suscribe o una referencia a un punto de extracción. La especificación de un EPR del punto de extracción indica que el consumidor va a utilizar notificaciones basadas en extracciones.
  4. Cree el filtro. Proporciona el nombre del tema al cual desea suscribir al consumidor.
  5. Cree una expresión de tema y añádala al filtro. Las prefixMappings son correlaciones entre los prefijos de los espacios de nombres y sus espacios de nombres correspondientes para prefijos utilizados en la expresión.
  6. Cree un filtro de contenido de mensajes XPath 1.0. Por ejemplo, podría seleccionar un subconjunto de los mensajes disponibles en el tema, según el nivel de salario. Para ver un ejemplo del uso del filtro de contenido de mensajes, consulte Filtrado del contenido de mensajes de publicaciones.
  7. Cree la InitialTerminationTime. Ésta es la fecha en la que desea finalizar la suscripción. Por ejemplo, podría establecer un tiempo de 1 año en el futuro.
  8. Cree la información de política.
  9. Opcional: Construya una política que indique que el consumidor va a recibir notificaciones de estilo sin formato.
  10. Cree contenedores para albergar los varios valores devueltos del intermediario:
    • La referencia de la suscripción
    • La hora actual en el intermediario
    • La hora de finalización de la suscripción
    • Elementos adicionales
  11. Invoque la operación de suscripción llamando al método asociado en el apéndice (stub).
  12. Obtenga los valores devueltos:
    • Una referencia de punto final para la suscripción que se ha creado. Esto es necesario para la gestión posterior de duración de la suscripción, por ejemplo, una pausa en la suscripción.
    • La hora actual en el intermediario.
    • La hora de finalización de la suscripción.
    • Cualquier otra información.

Ejemplo

El código de ejemplo siguiente describe una aplicación cliente de suscriptor que puede suscribirse a una aplicación consumidora con un intermediario:
//
Busque el servicio JAX-RPC. El nombre JNDI es específico a su
implementación de cliente de servicios web
InitialContext context = new InitialContext();
javax.xml.rpc.Service service = (javax.xml.rpc.Service) context.lookup(
    "java:comp/env/services/NotificationBroker");

// Obtenga un archivo de apéndice  (stub) para el puerto en el que desea invocar las operaciones
NotificationBroker stub = (NotificationBroker) service.getPort(NotificationBroker.class);

// Cree la ConsumerReference. Ésta contiene la dirección del servicio web del consumidor que se
// suscribe, o de forma alternativa, es una referencia a un punto de extracción (vea la alternativa más abajo). Especificar
// el EPR del punto de extracción indica que el consumidor va a utilizar notificaciones basadas en extracciones.
EndpointReference consumerEPR = 
    EndpointReferenceManager.createEndpointReference(new URI("http://myserver.mycom.com:9080/Consumer"));

/*
// ConsumerReference alternativo para notificaciones basadas en extracciones:

EndpointReference consumerEPR = pullPointEPR;

*/

// Cree el filtro. Éste proporciona el nombre del tema al cual desea suscribir al consumidor
Filter filter = new Filter();

// Cree una expresión de tema y añádala al filtro. Las prefixMappings son correlaciones entre los prefijos
// de espacio de nombres y sus espacios de nombres correspondientes para prefijos utilizados en la expresión
Map prefixMappings = new HashMap();
prefixMappings.put("abc", "uri:example");
TopicExpression exp =
    new TopicExpression(TopicExpression.SIMPLE_TOPIC_EXPRESSION, "abc:ExampleTopic", prefixMappings);        
filter.addTopicExpression(exp);


//Cree un filtro de contenido de mensaje XPath
//Este ejemplo selecciona un subconjunto de los mensajes disponibles en el tema, basándose en el nivel de salario
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);

// Cree la InitialTerminationTime. Ésta es la fecha en la que desea finalizar la suscripción.
// Por ejemplo, establezca un periodo de tiempo de 1 año en el futuro.
Calendar cal = Calendar.getInstance();
cal.add(Calendar.YEAR, 1);
AbsoluteOrRelativeTime initialTerminationTime = new AbsoluteOrRelativeTime(cal);

// Cree la información de Policy
SOAPElement[] policyElements = null;

/*
Opcional
--------
La líneas siguientes muestran cómo construir una política que indique que el consumidor va a 
recibir notificaciones de estilo sin modificar:

    javax.xml.soap.SOAPFactory soapFactory = javax.xml.soap.SOAPFactory.newInstance();
    SOAPElement useRawElement = null;

    if (soapFactory instanceof IBMSOAPFactory) {
        // Puede utilizar los métodos de añadir valor proporcionados por la API IBMSOAPFactory para crear el SOAPElement
        // de una serie 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 };
*/

// Cree mantenimientos para conservar los valores múltiples devueltos del intermediario:
// La referencia de la suscripción
EndpointReferenceTypeHolder subscriptionRefHolder = new EndpointReferenceTypeHolder();

// La fecha actual en el intermediario
CalendarHolder currentTimeHolder = new CalendarHolder();

// La fecha de finalización de la suscripción
CalendarHolder terminationTimeHolder = new CalendarHolder();

// Cualquier elemento adicional
AnyArrayHolder anyOtherElements = new AnyArrayHolder();

// Invoque la operación de suscripción mediante la llamada al método asociado en el archivo de apéndice (stub)
stub.subscribe(consumerEPR,
                       filter,
                       initialTerminationTime,
                       policyElements,
                       anyOtherElements,
                       subscriptionRefHolder,
                       currentTimeHolder,
                       terminationTimeHolder);

// Obtenga los valores devueltos:
// Una referencia de punto final para la suscripción que ha sido creada. Es necesario para
// una gestión posterior del ciclo de vida de la suscripción, por ejemplo, hacer una pausa en la suscripción
com.ibm.websphere.wsaddressing.EndpointReference subscriptionRef = subscriptionRefHolder.value;

// La fecha actual en el intermediario
Calendar currentTime = currentTimeHolder.value;

// La fecha de finalización de la suscripción
Calendar terminationTime = terminationTimeHolder.value;

// Cualquier otra información
SOAPElement[] otherElements = anyOtherElements.value;

Icon that indicates the type of topic Task topic



Timestamp icon Last updated: last_date
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=tjwsn_ex_sub
File name: tjwsn_ex_sub.html