Creación de una aplicación de servicio web JAX-RPC que utiliza el direccionamiento de servicios web

El direccionamiento de servicios web (WS-Addressing) ayuda a la interoperatividad entre los servicios web mediante la definición de un método estándar para direccionar servicios web y para proporcionar información de direccionamiento en los mensajes. Esta tarea describe los pasos necesarios para crear un servicio web JAX-RPC al que se accede a través de una referencia de punto final de WS-Addressing. Esta tarea también describe los pasos adicionales que son necesarios para utilizar recursos con estado como parte del servicio web.

Antes de empezar

Los pasos descritos en esta tarea se aplican a servidores y clientes que se ejecutan en WebSphere Application Server.

Acerca de esta tarea

Realice esta tarea si está creando un servicio web que utiliza la especificación WS-Addressing.

Procedimiento

  1. Proporcione una interfaz de servicio web, creando o generando un documento WSDL (Web Services Description Language) para el servicio web, que devuelve una referencia de punto final al servicio de destino. La interfaz debe devolver una referencia de punto final, que puede realizarse utilizando una operación de fábrica o un servicio de fábrica independiente. El servicio de destino puede atender una instancia de recurso, por ejemplo, un carro de la compra.
  2. Implemente el servicio web creado en el paso anterior. Para la parte WS-Addressing de la implementación, realice los pasos siguientes:
    1. Cree una referencia de punto final que haga referencia al servicio web, siguiendo las instrucciones de Creación de referencias de punto final utilizando la API de direccionamiento de servicios Web propiedad de IBM.
    2. Opcional: Si la interfaz implica un servicio web que atiende una instancia de recurso, cree o busque la instancia de recurso.
    3. Opcional: Si utiliza una instancia de recurso, obtenga el identificador del recurso y asócielo a la referencia del punto final como un parámetro de referencia, utilizando el método EndpointReference.setReferenceParameter(QName nombre_id_recurso, valor de serie). El identificador de recursos depende de la aplicación y podría generarse durante la creación de la instancia del recurso.
      Atención: No incluya información importante en el identificador de recurso, ya que el identificador se propaga en el mensaje SOAP.
      Ahora la referencia del punto final apunta al recurso.
    4. Vuelva a la referencia del punto final.
  3. Si el servicio web utiliza instancias de recursos, amplíe la implementación para que correlacione los mensajes de entrada con las instancias de recursos correspondientes. Puesto que ha asociado el identificador de recurso a la referencia del punto final que ha creado anteriormente, cualquier mensaje entrante direccionado a dicha referencia de punto final contendrá la información del identificador de recurso, como un parámetro de referencia en la cabecera SOAP del mensaje. Puesto que el identificador de recurso se pasa a la cabecera SOAP, no tendrá que exponerlo en la interfaz del servicio web. Cuando WebSphere Application Server recibe el mensaje, coloca esta información en el contexto del mensaje de la hebra. Amplíe la implementación para realizar las acciones siguientes:
    1. Obtenga el identificador de la instancia de recurso del contexto del mensaje, utilizando el método EndpointReferenceManager.getReferenceParameterFromMessageContext(QName resource_id_name).
    2. Reenvíe el mensaje a la instancia de recurso adecuada.
  4. Para configurar un cliente para comunicarse con el servicio, utilice la referencia del punto final producida por el servicio en el primer paso para enviar mensajes al punto final.
    1. Obtenga un objeto Stub (buscando el servicio en la interfaz JNDI (Java™ Naming and Directory Interface)), o cree un objeto Call vacío.
    2. Asocie la referencia de punto final al objeto de proxy. Utilice el método setProperty(String nombre_propiedad, Object valor) del objeto Stub o Call. Utilice la constante WSADDRESSING_DESTINATION_EPR de WS-Addressing como nombre de propiedad y la referencia de punto final como valor.
      Este procedimiento configura automáticamente el objeto Stub o Call para representar el servicio web (o la instancia de recurso si la interfaz utiliza un servicio web que atiende una instancia de recurso) de la referencia del punto final. Para los objetos Call, este proceso incluye la configuración de la interfaz y de los metadatos del punto final (elementos portType y port) que se asocian a la referencia de punto final.
      Nota: Si los metadatos de la referencia del punto final entran en conflicto con la información ya asociada con el mensaje de salida, por ejemplo, si el objeto Stub se configura para representar una interfaz distinta, se genera una excepción javax.xml.rpc.JAXRPCException en los intentos de invocar el punto final.

    Las invocaciones del objeto Stub o Call ahora se dirigen al servicio web o a la instancia de recurso que se ha definido en la referencia del punto final. Cuando se produce una invocación, el producto añade a la cabecera del mensaje las propiedades de direccionamiento de mensajes correctas, como el parámetro de referencia contenido en la referencia de punto final, que identifica un recurso de destino.

Resultados

El cliente y el servicio web se configuran para utilizar referencias de punto final mediante el soporte de WS-Addressing.

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

Los ejemplos siguientes corresponden a los pasos 1 a 4 del procedimiento. Los ejemplos muestran cómo una organización de TI puede utilizar los servicios web para gestionar una red de impresoras. Es posible que la organización represente cada impresora como un recurso que se direcciona a través de una referencia de punto final. Los siguientes ejemplos muestran cómo codificar dicho servicio utilizando las interfaces de programación de aplicaciones (API) de Web Services Addressing (WS-Addressing) propiedad de IBM proporcionadas por WebSphere Application Server y JAX-WS.

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.

El método createPrinter mostrado en el ejemplo siguiente crea una referencia de punto final al servicio Printer. Entonces la operación obtiene el identificador de la instancia de recurso de impresora individual y lo asocia con la referencia de punto final. Por último, el método createPrinter convierte el objeto EndpointReference, que ahora representa la nueva impresora, en un objeto W3CEndpointReference, y devuelve la referencia de punto final convertida.

import com.ibm.websphere.wsaddressing.EndpointReferenceManager;
import com.ibm.websphere.wsaddressing.EndpointReference;
import com.ibm.websphere.wsaddressing.jaxws.EndpointReferenceConverter;
import com.ibm.websphere.wsaddressing.jaxws.W3CEndpointReference;

import javax.xml.namespace.QName;

public class MyClass {

    // Crear la impresora
    ...

    // Definir el ID de recurso de impresora como constante estática tal como se necesita en pasos posteriores
    public static final QName PRINTER_ID_PARAM_QNAME = new QName("example.printersample",
                                                                 "IBM_WSRF_PRINTERID", "ws-rf-pr" ); 
    public static final QName PRINTER_SERVICE_QNAME = new QName("example.printer.com", "printer", "..."); 
    public static final String PRINTER_ENDPOINT_NAME = new String("PrinterService");
    
    public W3CEndpointReference createPrinter(java.lang.Object createPrinterRequest)
    throws Exception {
     // Crear una EndpointReference destinado al URI WebService y al nombre de puerto apropiados.
     EndpointReference epr =  EndpointReferenceManager.createEndpointReference(PRINTER_SERVICE_QNAME, 
                                                                               PRINTER_ENDPOINT_NAME);

     // 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     
     // para el servicio.
     epr.setReferenceParameter(PRINTER_ID_PARAM_QNAME,resource_identifier);
     // Ahora la referencia de punto final está destinada al recurso en lugar del servicio.
     ...

     return EndpointReferenceConverter.createW3CEndpointReference(epr);
    }
}

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 de WS-Addressing, WebSphere Application Server las procesa antes de que se asigne el mensaje al punto final de aplicación y las establece en el contexto de mensaje de 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:

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 de servicio web puede reenviar mensajes basándose en la identidad de impresora adquirida en el método getReferenceParameterFromMessageContext a las instancias de impresora apropiadas.

El cliente crea un proxy JAX-WS para la impresora y convierte el proxy en un objeto BindingProvider. Luego el cliente asocia el objeto EndpointReference obtenido anteriormente con el contexto de solicitud del objeto BindingProvider, como se ilustra en el ejemplo siguiente.
import javax.xml.ws.BindingProvider;
...

 javax.xml.ws.Service service= ...;
 Printer myPrinterProxy = service.getPort(portName, Printer.class);
	
 javax.xml.ws.BindingProvider bp = (javax.xml.ws.BindingProvider)myPrinterProxy;
	 
 // Recuperar el contexto de solicitud para el objeto BindingProvider
 Map myMap = myBindingProvider.getRequestContext();  

 // Asociar la referencia de punto final que representa la nueva impresora con el contexto de solicitud 
 // de modo que el objeto ahora BindingProvider representa una instancia de impresora específica.
 myMap.put(WSADDRESSING_DESTINATION_EPR, destinationEpr);

...
Ahora el objeto BindingProvider representa la nueva instancia de recurso de impresora y el cliente lo puede utilizar para enviar mensajes a la impresora mediante el servicio web de impresora. Cuando el cliente invoca el objeto BindingProvider, WebSphere Application Server añade las propiedades de direccionamiento de mensaje apropiadas a la cabecera de mensaje, en este caso se trata de un parámetro de referencia contenido en la referencia de punto final que identifica el recurso de impresora de destino.

De forma alternativa, el cliente puede utilizar un objeto JAX-RPC Stub o Call, que el cliente configura para representar la nueva impresora. El uso del objeto Call se ilustra en el ejemplo siguiente.

import javax.xml.rpc.Call;
...
 :
 // Asociar la referencia de punto final que representa la nueva impresora con la llamada.
 call.setProperty(
        "com.ibm.websphere.wsaddressing.WSAConstants.
                             WSADDRESSING_DESTINATION_EPR ", epr);

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.

Qué hacer a continuación


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=twbs_wsa_rap
File name: twbs_wsa_rap.html