Ejemplo: creación de un servicio web que utiliza la API de direccionamiento de servicios web JAX-WS para acceder a una instancia de recursos de servicio web genérica

Suponga una organización de TI que tiene una red de impresoras que desea gestionar utilizando servicios web. Es posible que la organización represente cada impresora como un recurso que se direcciona a través de una referencia de punto final. Este ejemplo muestra cómo codificar dicho servicio utilizando las Interfaces de programación de aplicaciones (API) de Direccionamiento de servicios web (WS-Addressing) de JAX-WS que proporciona WebSphere Application Server.

Cómo proporcionar una interfaz de servicio web que devuelva una referencia de punto final al servicio de destino

La organización de TI implementa un servicio PrinterFactory que ofrece un elemento portType de CreatePrinter. Este elemento portType acepta un mensaje CreatePrinterRequest para crear un recurso que representa una impresora lógica y responde con una referencia de punto final que es una referencia al recurso.

La definición WSDL para un servicio PrinterFactory de este tipo incluye el código siguiente:
<wsdl:definitions targetNamespace="http://example.org/printer" ...
                  xmlns:pr=" http://example.org/printer">
  <wsdl:types>
    ...
    <xsd:schema...>
      <xsd:element name="CreatePrinterRequest"/>
      <xsd:element name="CreatePrinterResponse" 
                   type="wsa:EndpointReferenceType"/>
    </xsd:schema>
  </wsdl:types>
  <wsdl:message name="CreatePrinterRequest">
    <wsdl:part name="CreatePrinterRequest" 
               element="pr:CreatePrinterRequest" />
  </wsdl:message>
  <wsdl:message name="CreatePrinterResponse">
    <wsdl:part name="CreatePrinterResponse" 
               element="pr:CreatePrinterResponse" />
  </wsdl:message>
  <wsdl:portType name="CreatePrinter">
    <wsdl:operation name="createPrinter">
      <wsdl:input name="CreatePrinterRequest" 
                  message="pr:CreatePrinterRequest" />
      <wsdl:output name="CreatePrinterResponse"
                  message="pr:CreatePrinterResponse" />
    </wsdl:operation>
  </wsdl:portType>
</wsdl:definitions>

La operación CreatePrinter del ejemplo anterior devuelve un objeto wsa:EndpointReference que representa el recurso de impresora recién creado. El cliente puede utilizar esta referencia de punto final para enviar mensajes a la instancia de servicio que representa la impresora.

Implementación de la interfaz de servicio web

El método createPrinter que se muestra en el ejemplo siguiente obtiene el identificador de la instancia de recurso individual de impresora. La operación creará una referencia de punto final al servicio Printer, y asocia el ID de impresora con la referencia de punto final. Por último, el método createPrinter devuelve la referencia de punto final

import javax.xml.ws.wsaddressing.W3CEndpointReference;
import javax.xml.ws.wsaddressing.W3CEndpointReferenceBuilder;

import javax.xml.namespace.QName;

import org.w3c.dom.Document;
import org.w3c.dom.Element;

public class MyClass {

  // Crear la impresora
  ...

  // Definir el ID de recurso de impresora como una constante estática, ya que será necesario en pasos posteriores
    public static final QName PRINTER_SERVICE_QNAME = new QName("example.printer.com", "printer", "..."); 
    public static final QName PRINTER_ENDPOINT_NAME = new QName("example.printer.com", "PrinterService", "...");
    
    public W3CEndpointReference createPrinter(java.lang.Object createPrinterRequest)
    {
     Document document = ...;

     // Crear o buscar el recurso con estado y derivar una
     // serie de identificador de recurso.
     String resource_identifier = "...";
     
     // Asociar este identificador de recurso con EndpointReference como  
     // parámetro de referencia.
     // La elección de nombre es arbitraria, pero debe ser exclusiva     
     // del servicio.
     Element element = document.createElementNS("example.printersample",
             "IBM_WSRF_PRINTERID");
     element.appendChild( document.createTextNode(resource_identifier) );
     ...
     
     // Crear una EndpointReference destinado al URI WebService y al nombre de puerto apropiados.
     // También se puede utilizar el método alternativo getEndpointReference() de MessageContext.
     W3CEndpointReferenceBuilder builder = new W3CEndpointReferenceBuilder();
     builder.serviceName(PRINTER_SERVICE_QNAME);
     builder.endpointName(PRINTER_ENDPOINT_NAME);
     builder.referenceParameter(element);
     
     // Ahora la referencia de punto final está destinada al recurso en lugar del servicio.
     return builder.build();
    }
}

Ampliación del servicio de destino para comparar los mensajes de entrada con las instancias de recurso de servicio web

Debido a la implementación de servicio web descrita anteriormente, la instancia de recurso de impresora tiene ahora un identificador exclusivo incorporado en la referencia de punto final. Este identificador se convierte en un parámetro de referencia en la cabecera SOAP de los mensajes subsiguientes destinados al servicio web y el servicio web lo puede utilizar para comparar los mensajes de entrada con la impresora apropiada.

Cuando un servicio web recibe un mensaje que contiene propiedades de direccionamiento de mensajes WS-Addressing, WebSphere Application Server procesa estas propiedades antes de enviar el mensaje al punto final de la aplicación, y las establece en el contexto de mensajes en la hebra. La aplicación de servicio web de impresora accede a los parámetros de referencia asociados con el punto final de destino desde el objeto WebServiceContext, como se ilustra más abajo:

@Resource
private WebServiceContext context;
...
List list = (List) context.getMessageContext().get(MessageContext.REFERENCE_PARAMETERS);

Si su aplicación utiliza la versión 2004/08 de la especificación WS-Addressing, utilice la API propietaria de IBM para recuperar los parámetros de mensaje, según se muestra en el ejemplo siguiente.

import com.ibm.websphere.wsaddressing.EndpointReferenceManager; 
...
 // Inicializar el nombre de parámetro de referencia
 QName name = new QName(..);
 // Extraer el valor de String.
 String resource_identifier = 
        EndpointReferenceManager.getReferenceParameterFromMessageContext(PRINTER_ID_PARAM_QNAME);

La implementación del servicio web puede reenviar mensajes en base al ID de la impresora para las instancias de impresora adecuadas.

Utilización de referencias de punto final para enviar mensajes a un punto final

El cliente utiliza la referencia de punto final devuelta desde el servicio para crear un proxy JAX-WS para la impresora, según se muestra en el ejemplo siguiente.
javax.xml.ws.Service jaxwsServiceObject= ...;
W3CEndpointReference epr = ...;
...
Printer myPrinterProxy = jaxwsServiceObject.getPort(epr, Printer.class, new AddressingFeature());
El objeto proxy representa ahora la nueva instancia del recurso impresora y el cliente la puede utilizar para enviar mensajes a la impresora a través del servicio web Printer. Cuando un cliente invoca el servicio, WebSphere Application Server añade las propiedades de direccionamiento de mensaje adecuadas a las cabecera del mensaje que, en este caso, es un parámetro de referencia que se encuentra dentro de la referencia de punto final que identifica el recurso de impresora de destino.

Desde la perspectiva del cliente, la referencia de punto final es opaca. El cliente no puede interpretar el contenido de los parámetros de referencia de punto final y no debe intentar utilizarlos de ningún modo. Los clientes no pueden crear directamente instancias de referencias de punto final ya que los parámetros de referencia son privados para el proveedor de servicios; los clientes deben obtener las referencias de punto final del proveedor de servicios, como, por ejemplo, mediante un servicio de fábrica de proveedor y, a continuación, utilizarlas para dirigir las operaciones de servicio web al punto final representado por la referencia de punto final, tal como se muestra.


Icon that indicates the type of topic Reference topic



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