Práctica 6. Servicios WEB (Java JAX-WS)

SCS, 2010/11


Índice General

Introducción

En esta práctica se pretende mostrar el uso del API de servicios web de Java (JAX-WS [Java API for XML Web Services]). Se mostrará como acceder a servicios Web ya publicados y como crear un servicio Web propio.

Los paquetes, clases, anotaciones e interfaces que implementan JAX-WS habitualmente forman parte de un servidor de aplicaciones Java EE, aunque la implementación de referencia se distribuye dentro de JAVA SE 6 (jdk 1.6), por lo que es posible utilizarlo de forma aislada.

JAX-WS reemplaza y amplía al anterior API de accesos a servicios Web (JAX-RPC), aunque actualmente ambos están en uso.

JAX-WS hace uso de anotaciones Java para describir elementos de las clases implicadas en la implementación del servicio y simplificar el desarrollo de servicios Web.

Para el manejo de los ficheros XML que conforman los mesnajes de petición y respuesta SOAP, JAX-WS hace uso del API JAXB (Java Architecture for XML Binding).

Con JAXB es posible mapear un documento XML en una jerarquía de objetos Java y viceversa, haciendo más sencilla la gestión y manejo de documentos XML, sin necesidad de trabajar con APIs de más bajo nivel como SAX o DOM. Nota: Internamente la implementación de JAXB usa SAX para procesar los docuentos XML.

Para el caso concreto de los servicios WEB basados en SOAP se incluyen 2 herramientas adicionales:

Ejercicio 1: Uso de Servicios Web ya publicados

Se mostrará un ejemplo de creación de clientes para Servicios Web ya publicados a partir del documento WSDL que los describe.

Repositorio de servicios web

Para el ejemplo se usarán los servicios Web del repositorio http://www.webservicex.net/

Comentarios:

Interesante: Repositorios de Servicios Web públicos

Pasos a seguir

  1. Importar las definiciones WSDL y generar las clases de apoyo para el cliente (artefactos del cliente)
    $ mkdir cliente1    (crear un directorio de trabajo)
    $ cd cliente1
    $ wsimport http://www.webservicex.net/WeatherForecast.asmx?wsdl -p usa_weather -verbose
    

    Se genera el paquete usa_weather que contiene las clases de apoyo

    Notas:

  2. Escribir el cliente que haga uso del servicio

  3. Compilar el cliente
    $ javac ClienteTiempo.java
    

  4. Ejecutar el cliente
    $ java ClienteTiempo "Las Vegas"
    $ java ClienteTiempo "New York"
    

Tareas a realizar (no entregable)

Se propone repetir el mismo ejercicio con otro servicio Web similar.

Nota: Este ejercicio no hay que entregarlo, es sólo una propuesta

Ejercicio 2: Implementación de un Servicio Web con JAX-WS

Se verá un ejemplo de la definición de un Servicio Web propio. Se trata de crear un servicio Web que ofrezca las funcionalidades de una calculadora remota.

Se parte de un código de muestra con la siguiente estructura de directorios

Descarga: ws2.tar.gz ws2.zip

Pasos a seguir

  1. Descomprimir el paquete.
    $ tar xzvf ws2.tar.gz
    $ cd ws2
    

  2. Implementación del servicio Web (fichero servidor/CalculadoraWS.java)

  3. Compilar la clase del servicio
    $ javac servidor/CalculadoraWS.java
    

  4. Generar artefactos del servidor: clases auxiliares (skeleton) + docuemnto WSDL
    $ wsgen -cp . -wsdl servidor.CalculadoraWS -verbose
    

    Se hace uso de la herramienta wsgen incluida en Java SE 6

    Importante: Si no se ha especificado una URL en la anotación @WebService es necesario indicar la URL de ''escucha'' en el atributo location de <soap:address location="......."> dentro del elemento <service> <port> .... </port> </service>

    Notas:

    Tareas: Inspeccionar los ficheros generados (especialmente el WSDL)

  5. Despliegue del servidor

    En este caso se simplificará el despliegue usando el mini-servidor web que se incluye en Java SE para estas situaciones.

    Importante: En un entorno real, el Servicio Web se desplegaría dentro de un Servidor de Aplicaciones Java EE (ver comentarios finales), normalmente mediante un servlet que atendría sus peticiones, redirigiéndolas a los métodos de implementación.

    < en un terminal distinto >
    $ javac LanzadorServicio.java
    $ java LanzadorServicio          [queda a la espera]
    

    Se puede comprobar que ha funcionado correctamente abriendo la URL http://localhost:8888/calculadora?wsdl en un navegador WEB. Se debería mostar el documentos WSDL del servicio.

  6. Implementación del cliente

    El esquema es análogo al realizado en el ejemplo 1

    1. Generar artefactos del cliente a partir del documento WSDL
      $ wsimport CalculadoraWSService.wsdl -p cliente.calc_aux -verbose
      
      Notas:
      • Las clases auxiliares se dejarán en el paquete cliente.calc_aux
      • Podría indicarse la URL http://localhost:8888/calculadora?wsdl en lugar del fichero WSDL

    2. Escribir código del cliente (ya está hecho)
      • Debe importar el paquete calc_aux
      • El service a usar es CalculadoraWSService [ver el WSDL generado]
      • El port a usar CalculadoraWSPort [ver el WSDL generado]

    3. Compilar y ejecutar (desde el directorio /home/alumno/.../ws2/)
      $ javac cliente/EjemploClienteWS.java
      $ java cliente.EjemploClienteWS
      

Tareas a realizar

Se pide realizar una evaluación del redimiento de las llamadas a Servicios Web usando el ejemplo de la calculadora remota.

  1. Implementar un programa Java que haga 5.000-10.000 invocaciones a un método int suma(int, int) local y otras 5.000-10.000 llamadas SOAP al método suma de la calculadora remota.
  2. (opcional) Retomar las implementaciones de la calculadora remota en RMI y CORBA de prácticas anteriores (si las hubiera) y crear un cliente para cada una de las dos implementaciones (RMI, CORBA) que haga esas 5.000-10.000 invocaciones.
  3. Medir el tiempo consumido en la batería de invocaciones (usar el método System.nanotime())
    long startTime = System.nanoTime();
    // ... the code being measured ...
    long estimatedTime = System.nanoTime() - startTime;
    

Documentación a entregar

Comentarios finales

  1. Como se mencionó, los servicios Web Java (construidos con JAX-WS o con JAX-RPC) suelen desplegarse dentro de un servidor de aplicaciones Java EE (Java Enterprise Edition).
  2. La mayoría de IDEs (entornos integrados de desarrollo) de Java, como Eclipse o Netbeans, incluyen asistentes y/o automatizan las tareas de importación/exportación de WSDL, generación de ''artefactos'', compilación, empaquetado y despliegue de aplicaciones.



ribadas 2010-11-23