Generación de SOA con servicios web mediante WebSphere Studio, parte 2: Creación de un servicio web a partir de una clase Java

Aprenda a crear un servicio web de alquiler de DVD y un cliente para ese servicio. Este tutorial le mostrará cómo crear un servicio web a partir de una clase Java usando WebSphere® Studio Application Developer Integration Edition. Los siguientes dos tutoriales tratarán de dos servicios de alquiler de DVD y un servicio agregador de búsquedas relacionado. (Ver todas las partes de esta serie de tutoriales.)

Warner Onstine, Senior Mentor, ArcMind

Warner Onstine, Senior Mentor de ArcMind, Inc., es un desarrollador con más de 8 años de experiencia en la industria, la mayor parte de los cuales dedicó al desarrollo de aplicaciones Web. Warner es coautor del libro Professional Java Tools for Extreme Programming, que contiene capítulos sobre Maven, pruebas unitarias en Swing y cobertura de código con jcoverage.



Rick Hightower, Chief Mentor, ArcMind

Rick Hightower, Chief Mentor de ArcMind, Inc., es un desarrollador que ha cosechado múltiples logros, premios de la industria y certificaciones. Es coautor de los libros Professional Jakarta Struts y Java Tools to Extreme Programming, y escribió 1/5 del libro Mastering Tomcat. Rick es autor de numerosos tutoriales bien recibidos sobre EJB 2.0 CMP CMR, XDoclet, Apache Axis, ETTK, WSDK, Struts Tiles, etc. para IBM developerWorks.



05-08-2011

Acerca de este tutorial

Objetivo del tutorial

Aprenda a crear un servicio web de alquiler de DVD y un cliente para ese servicio. Los siguientes dos tutoriales tratarán de otros servicios:

  • Dos servicios de alquiler de DVD
  • Un servicio agregador de búsquedas relacionado

Los servicios de alquiler de DVD tienen una interfaz ligeramente diferente a fin de mostrar cómo el agregador de búsquedas puede buscar en dos fuentes (ligeramente) distintas. En un principio nos centraremos en el lado cliente del servicio web, el cual accederá al agregador que busca y envía recomendaciones para alquilar. Los siguientes dos tutoriales tratarán de las interfaces del agregador y del proveedor de alquileres de DVD con mayor profundidad.

Conocimientos necesarios para el tutorial

Este tutorial presupone un conocimiento práctico del lenguaje de programación Java y de XML. Si bien no es obligatorio, sí es conveniente contar con un conocimiento de la tecnología J2EE. Todas las aplicaciones de ejemplo se implementan en la solución IBM WebSphere® Application Server (Application Server) que está incluida en WebSphere Studio Application Developer Integration Edition (Application Developer; en la sección Recursos encontrará un vínculo a una versión de prueba).

Contenido del tutorial

Este tutorial explora el mundo de los servicios web y la arquitectura orientada a servicios. Examina los siguientes temas, herramientas y técnicas:

Temas

  • Introducción a SOA
  • Introducción a la creación de servicios web a partir de clases Java con Application Developer
  • Introducción a las herramientas de servicios web

Herramientas

  • Asistente para servicios web de Application Developer
  • Exploración de servicios web de Application Developer

Técnicas

  • Creación de servicios web a partir de clases Java
  • Implementación del modelo como servicio web
  • Creación de servicios que interactúan entre sí

Acerca de los laboratorios de esta serie

Todos los tutoriales están centrados en un motor de búsqueda de alquileres de DVD que agrega los resultados de búsqueda de uno o más videoclubes cuyos catálogos están disponibles online. En el correspondiente caso de uso, Recomendaciones, el usuario elige qué categoría de película le gustaría alquilar y, sobre la base de su historial de alquileres, se usan servicios web para sugerir otras películas. En el primer tutorial ("Generación de SOA con servicios web mediante WebSphere Studio, parte 1: Introducción a SOA y servicios web", ver Recursos), se creó y se ejecutó un servicio web simple. En este segundo tutorial, usted podrá expandir la exploración del trabajo con servicios web a través de tres laboratorios:

  • Laboratorio 1: Generación e implementación de un servicio web: en este laboratorio, usted podrá crear e implementar un servicio web simple que el agregador expondrá ante el cliente.
  • Laboratorio 2: Intercambio de objetos SOAP complejos: en este laboratorio, usted podrá mejorar el servicio web permitiendo que devuelva objetos SOAP más complejos para su uso por parte del cliente.
  • Laboratorio 3: Cliente de servicio web dinámico: en este laboratorio, usted podrá crear de manera dinámica un cliente de servicio web que consuma los objetos SOAP complejos.

Herramientas necesarias para el tutorial

Como mínimo, es necesario contar con Java SDK 1.3.1 o superior para ejecutar Application Developer. En el sitio de IBM developerWorks, encontrará una versión de prueba de WebSphere Application Developer Integration Edition y más información al respecto.


Arquitectura orientada a servicios y modelado de servicios

Introducción a la arquitectura orientada a servicios

La arquitectura orientada a servicios y el modelado de servicios son términos relativamente nuevos y, por eso mismo, todavía son objeto de debate y de definición dentro de la comunidad de servicios web en su conjunto.

Arquitectura orientada a servicios
Esencialmente, la arquitectura orientada a servicios es una colección de servicios que se comunican entre sí. La comunicación puede implicar dos o más servicios que coordinan una actividad. Es necesario contar con algún medio para conectar los servicios entre sí. Un servicio es una función bien definida y autónoma que no depende del contexto o estado de otros servicios. La SOA no se limita a servicios web, aunque IBM considera que es la mejor manera de lograrlo.

Modelado de servicios
El modelado de servicios es el modelado de diferentes servicios entre sí; esta definición entra en juego cuando una organización ha definido varios servicios para que trabajen en conjunto sin perder su individualidad. Un ejemplo sería el de una empresa que desea exponer su sistema ERP ante otras unidades de negocios, permitiendo que se conecten con el sistema sin necesidad de instalar un software especial en las computadoras. Asimismo, la empresa desea exponer su software de contabilidad ante el sistema ERP para que se puedan coordinar datos entre los dos sistemas. También podría existir otro servicio que agregue todos los servicios diferentes en un servicio principal para su uso por parte de una aplicación Web interna.

En este caso se pueden apreciar los beneficios de una SOA interna: la empresa ejerce control sobre las interfaces de servicio de sus unidades de negocios. Esto no significa que sea fácil de implementar, pero es mucho más fácil que tratar de coordinar con un proveedor externo que podría decidir agregar o eliminar porciones de su interfaz sin consultar a sus clientes.

Por lo general, la arquitectura orientada a servicios se expresa como un cliente que envía una solicitud a un proveedor de servicios, que puede enviar o no una respuesta. Estas son algunas interacciones típicas:

  • Recepción de mensajes (sin mensaje de devolución)
  • Recepción y respuesta (solicitud-respuesta)
  • Solicitud de respuesta (mensaje de salida y mensaje de entrada)
  • Publicación o suscripción (solo mensajes de salida)

Como se puede observar, hay una gran variedad de acciones que se pueden realizar al respecto. Este ejemplo pretende definir cómo se pueden usar estas opciones.

Respecto del cliente de búsqueda, es necesaria tener la capacidad de enviar una consulta al agregador y recibir de él una respuesta, por lo que aquí entra en juego la interacción de recepción y respuesta. Asimismo, se necesita la misma clase de interfaz entre el agregador y los proveedores de alquiler, de manera de permitir al agregador enviar su propia consulta a los proveedores de alquiler y recibir una respuesta que luego se combina para su envío al cliente.

También podría existir una opción en que el cliente de búsqueda se suscriba a un listado de los últimos DVD. Cuando se lanzan los DVD (por ejemplo, todos los martes), se podría enviar un mensaje al cliente informándole los últimos estrenos y permitiendo que los alquile de inmediato o que busque otros títulos.

Este mismo principio se aplica de manera inversa al agregador si se suscribe a un servicio similar de sus proveedores de alquiler (interacción derecepción de mensajes).

Como se puede observar, las cosas se pueden poner algo confusas, pero las interacciones se definen desde cualquier punto de vista que se utilice.

Diseño y SOA

Al tomar la decisión de implementar una SOA, es necesario tener en cuenta ciertos factores:

  • Identificación del servicio (decisiones de diseño): La rápida proliferación de objetos no ha permitido que las empresas alcancen economías de escala ya que intrínsecamente limita el potencial de la utilidad de negocios. Los primeros usuarios de SOA y servicios web comprendieron rápidamente que la proliferación de servicios web no contribuye a un modelo SOA sólido. Estas decisiones de diseño se toman durante el análisis y diseño orientado a servicios (SOAD), que se describe más adelante en esta serie (si desea obtener más información sobre SOAD, consulte la sección Recursos).
  • Diseño y realización del contenedor: Las decisiones de arquitectura y diseño son críticas para que un determinado servicio proporcione las cualidades fundamentales para la extensibilidad y el mantenimiento.
  • Opciones de diseño de granularidad: En el caso de los servicios, estas opciones deben corresponder a los niveles de reusabilidad y flexibilidad requeridos según el contexto. Los servicios más generales pueden ayudar a encapsular los cambios de los servicios técnicos más específicos, que tienden a cambiar con mayor frecuencia que la interfaz de servicios empresariales de nivel superior. Los factores de flexibilidad son los criterios fundamentales de encapsulación; no la encapsulación de la función.
  • Estado del servicio: Por lo general, se requieren decisiones de arquitectura y diseño respecto de la naturaleza sin estado de los servicios, si bien es necesario mantener el estado. Esto se suele realizar tomando decisiones arquitectónicas sobre los motores de coreografía (como el motor BPEL) y decisiones de diseño sobre la naturaleza sin estado de un servicio de negocios propuesto.
  • Acoplamiento flexible y configuración dinámica: Esta es una decisión de diseño que requiere el desacoplamiento de las interfaces de la implementación y la realización de protocolos a través de estándares abiertos. La conexión entre consumidores de servicios y proveedores de servicios debe ser estable y bien estructurada, pero a la vez flexible y fácilmente reconfigurable. Reconfigurable significa que los consumidores y los proveedores de un servicio puedan ser reensamblados manteniendo intacta su funcionalidad para obtener soluciones de negocios en diferentes entornos técnicos y con diferentes restricciones operativas con nuevos socios comerciales en una cadena de valor. Por lo tanto, la mera integración ya no es suficiente. El nombre de este nuevo juego es reconfiguración dinámica, que debe ser ubicua en un espectro de soporte que abarque áreas de infraestructura (en otras palabras, la infraestructura de software de apoyo), herramientas, plataformas de desarrollo, arquitecturas de referencia, patrones, métodos y modelos de referencia específicos de la industria.

Entonces ¿cuáles son los componentes fundamentales de una SOA?

  • Cartera de servicios: Describe los servicios de negocios de una SOA. Esto incluye una lista, clasificación y jerarquía de servicios definidos a través de la técnica de análisis y diseño orientado a servicios.
  • Componentes: Proporciona la realización funcional de los servicios.
  • Proveedores de servicios, consumidores de servicios y, opcionalmente, intermediarios de servicios: Participan con sus registros de servicios cuando se publican definiciones y descripciones de servicios.
  • Niveles de SOA: Aquí residen los componentes y servicios.

Como en el caso de cualquier otro tipo de arquitectura, SOA tiene muchos niveles diferentes con los que debe interactuar. Entre estos niveles se encuentran:

  1. Nivel de sistemas: bases de datos, sistemas de mensajería y otro software empaquetado
  2. Nivel de servicios: otros servicios web
  3. Nivel de negocios: componentes específicos de negocios
  4. Nivel de presentación: front-end Web o del cliente

La comprensión de estos niveles y de la manera en que interactúan con los servicios es fundamental en cualquier diseño SOA.

Modelado de servicios y UML

El modelado de servicios es un primo cercano de UML (lenguaje unificado de modelado), que fue creado para permitir que los desarrolladores pudieran modelar su código visualmente, generar código a partir de sus diagramas e implementar interfaces específicas que ellos mismos modelaron.

La especificación OMG establece que:
"El lenguaje unificado de modelado (UML) es un lenguaje gráfico para visualizar, especificar, construir y documentar los artefactos de un sistema con uso intensivo de software. El UML ofrece una manera estándar de escribir los planos de un sistema, incluyendo aspectos conceptuales, como procesos de negocios y funciones del sistema, y aspectos concretos, como instrucciones del lenguaje de programación, esquemas de bases de datos y componentes de software reutilizables".

Es importante destacar que UML es un lenguaje de especificación; no un método ni un procedimiento. El UML se usa para definir un sistema de software, para detallar los artefactos del sistema, documentar y construir—es el lenguaje en que se escribe el plano técnico del sistema—. El UML se puede usar de varias maneras para dar soporte a una metodología de desarrollo de software (comoRational Unified Process), pero, en sí, no especifica esa metodología o proceso.

UML define la notación y la semántica de los siguientes dominios:

  • Modelo de interacción con los usuarios o caso de uso: Describe el límite y la interacción entre el sistema y los usuarios. Se corresponde en algunos aspectos con un modelo de requisitos.
  • Modelo de interacción o comunicación: Describe cómo interactúan los objetos del sistema.
  • Modelo de estado o dinámico: Los gráficos de estado describen los estados o condiciones que adquieren las clases a través del tiempo. Los gráficos de actividad describen los flujos de trabajo que implementa el sistema.
  • Modelo lógico o de clases: Describe las clases y objetos que conforman el sistema.
  • Modelo de componentes físicos: Describe los componentes de software (y a veces de hardware) que conforman el sistema.
  • Modelo de implementación física: Describe la arquitectura física y la implementación de los componentes en la arquitectura de hardware.

El UML también define los mecanismos de extensión para satisfacer necesidades especiales (por ejemplo, extensiones de modelado de procesos de negocios o SOA).

Historia y objetivo de UML

Durante la década de 1990, se introdujeron en el mercado muchas tecnologías diferentes, junto con su propio conjunto de notaciones. Tres de los métodos más populares fueron Object Modeling Technique (OMT) (James Rumbaugh), Booch (Grady Booch) y OOSE (Ivar Jacobson). Cada uno de estos métodos tenía su propio valor y énfasis. OMT era fuerte en análisis y más débil en el área de diseño. Booch era fuerte en diseño y más débil en análisis. Jacobson era fuerte en análisis de comportamiento y más débil en el resto de las áreas.

El tiempo fue pasando, y Booch escribió su segundo libro, que adoptó muchas de las buenas técnicas de análisis postuladas por Rumbaugh y Jacobson, entre otros. Rumbaugh publicó una serie de artículos conocidos como OMT-2 que adoptaron muchas de las buenas técnicas de diseño de Booch. Los métodos comenzaban a converger, pero seguían teniendo sus propias notaciones. El uso de diferentes notaciones creó confusión en el mercado ya que un mismo símbolo tenía diferentes significados. Por ejemplo, un círculo relleno era un indicador de multiplicidad en OMT y un símbolo de agregación en Booch. Se empieza a usar el término guerras de métodos para describir esta época: ¿Una clase es una nube o un rectángulo? ¿Cuál es mejor?

El fin de las guerras de métodos en lo que respecta a la notación llega con la adopción del lenguaje unificado de modelado (UML). "UML es un lenguaje que se usa para especificar, visualizar y documentar los artefactos de un sistema orientado a objetos en desarrollo. Representa la unificación de las notaciones Booch, OMT y Objectory, así como las mejores ideas de otros metodólogos. Al unificar las notaciones usadas por estos métodos orientados a objetos, el lenguaje unificado de modelado sienta las bases de un estándar de facto en el ámbito del análisis y diseño orientado a objetos fundado sobre una amplia base de experiencia del usuario". (Extraído de la descripción de UML de Rational Rose).

Actualmente, UML está regido por el Object Management Group (OMG), que controla la especificación de nuevas notaciones UML y ha adoptado UML como su lenguaje de modelado estándar. En el sitio Web de OMG encontrará más información sobre el grupo.

Bueno, ahora que ya sabe un poco de SOA y de modelado, empecemos a trabajar con código


Laboratorio 1: Generación e implementación de un servicio web

Objetivo y generalidades del laboratorio

Este laboratorio tiene por objeto brindarle experiencia práctica para generar, implementar y probar un servicio web Java con Application Developer. La versión 5.1 de Application Developer permite generar servicios web, clientes de servicios web y documentos WSDL a partir de artefactos existentes.

Las siguientes capturas de pantalla muestran paso a paso cómo exponer un componente JavaBean existente como servicio web:

  1. Cree un proyecto Web llamado SimpleRPC para contener el código fuente (no es necesario activar "Configure Advanced Options" ("Configurar opciones avanzadas") en esta parte del tutorial).

  2. Cree un nuevo paquete para contener el componente JavaBean.

  3. Póngale el siguiente nombre al paquete lpc.dvdonline.simplerpc.server.
  4. Cree una nueva clase Java llamada DVDOnlineStore.

  5. Agregue el siguiente código al archivo de origen:
    package lpc.dvdonline.simplerpc.server;
    
    public class DVDOnlineStore {
    
    public String getDVD() { 
    return "Fight Club"; 
    }//end getDVD()
    
    }//end DVDOnlineStore
  6. Cree el nuevo servicio web.

  7. Seleccione la opción "Java bean Web Service" ("servicio web Java bean") y haga clic en Next (Siguiente).
  8. Seleccione el proyecto de servicio web que se usará en el tiempo de ejecución y haga clic en Next.
  9. Seleccione el componente JavaBean a exponer y haga clic en Next.

  10. Seleccione el estilo y uso del servicio web y haga clic en Finish (Finalizar). Este paso puede tardar un poco.

Prueba del servicio web

Ahora que ya tiene el servicio, es necesario probarlo. Afortunadamente, Application Developer facilita mucho esta tarea.

  1. Haga clic con el botón derecho en DVDOnlineStore.java y seleccione "Launch the Universal Test Client" ("Iniciar cliente de prueba universal ")del menú Web Services (servicios web).

    Esto lo llevará directamente al explorador Web que muestra los servicios.

  2. Explore hasta llegar a su servicio haciendo clic en la referencia de objeto de DVDOnlineStore.

  3. Haga clic en el método getDVD y luego invoque el servicio haciendo clic en el botón Invoke (Invocar).

  4. Si aparece el mensaje de respuesta de "Fight Club", es porque el servicio ha sido probado y está activo y en funcionamiento. ¡Felicitaciones!

Progreso

Repasemos qué fue lo que hizo usted y qué fue lo que hicieron los asistentes para servicios web.

Usted creó un servicio web usando una clase Java estándar. No definió una interfaz ni creó un enlace. El asistente para servicios web se ocupó de la mayor parte del trabajo pesado. Implementó el servicio web como una aplicación Web J2EE incluida en un archivo WAR incluido en un archivo EAR.

Si bien usted no definió una interfaz, el asistente para servicios web la creó por usted:

package lpc.dvdonline.simplerpc.server;

public interface DVDOnlineStore_SEI extends java.rmi.Remote {
    public java.lang.String getDVD();
}

Si alguna vez trabajó con implementaciones RMI, esta interfaz es idéntica al tipo de interfaz que se hubiera creado para el sirviente RMI.

Además, el asistente para servicios web creó un archivo WSDL. El tutorial "Describing Web Services in WSDL" trata muy bien el tema de los archivos WSDL (Ver Recursos).


Laboratorio 2: Intercambio de objetos SOAP complejos

Generalidades del laboratorio

Este laboratorio tiene por objeto demostrar la capacidad de Application Developer para intercambiar tipos de datos SOAP complejos. Si bien la transmisión de cadenas y matrices simples es una buena manera de empezar a usar servicios web, las aplicaciones del mundo real suelen requerir el intercambio entre el cliente y el servicio de objetos enteros y estructuras de datos complejos similares. JAX-RPC y el esquema XML son compatibles con los tipos de datos complejos.

Definición de un tipo Java para representar un objeto DVD

Cuando se creó SOAP, la idea era proporcionar un mecanismo neutral para el transporte de objetos dentro de un entorno distribuido y heterogéneo. De allí se deriva su nombre: Simple Object Access Protocol (Protocolo simple de acceso a objetos). Para lograrlo, cada lado debe tener una representación de objeto nativo y luego acordar un formato neutral para asignar a su representación nativa. En este caso, tanto el cliente como el servidor están basados en código Java, por lo que usan el mismo formato nativo: una clase Java.

La clase DVD es un componente JavaBean básico con tres campos: título (String), rango (int) y categoría (String), junto con los captadores y establecedores de siempre.

  1. Cree un nuevo proyecto Web llamadoComplexRPC. Si lo desea, modifique el archivo EAR que contendrá el proyecto Web.
  2. Cree un paquete llamado lpc.dvdonline.complexrpc.service.
  3. Cree una nueva clase Java llamada DVD.
  4. Agregue el siguiente código al archivo de origen:

    package lpc.dvdonline.complexrpc.service;
    
    public class DVD {
    
    private String title; // unique id (primary key)
    private int rank;
    private String category;
    
    public DVD() {
    
    title = "no title";
    rank = 0;
    category = "no category";
    } //end DVD()
    
    public DVD(String _title, int _rank, String _category) {
    title = _title;
    rank = _rank;
    category = _category;
    } //end DVD( String, int, String )
    
    public String getCategory() {
    return category;
    } //end getCategory()
    
    public int getRank() {
    return rank;
    } //end getRank()
    
    public String getTitle() {
    return title;
    } //end getTitle()
    
    public void setCategory(String category) {
    this.category = category;
    } //end setCategory( String )
    
    public void setRank(int rank) {
    this.rank = rank;
    } //end setRank( int )
    
    public void setTitle(String title) {
    this.title = title;
    } //end setTitle( String )
    
    } //end class DVD

Generación del proveedor de servicios de ComplexRPC

En esta sección se creará un servicio web que devuelva tipos complejos. Siga estos pasos:

  1. Cree un nuevo paquete llamadolpc.dvdonline.complexrpc.server.
  2. Cree una clase Java llamadaDVDOnlineStore.
  3. Agregue el siguiente código al archivo de origen:

    package lpc.dvdonline.complexrpc.server;
    
    import lpc.dvdonline.complexrpc.service.DVD;
    
    public class DVDOnlineStore {
    
    
    public DVD getDVD() {
    
    return new DVD("Fight Club", 10, "Weird but good");
    
    }//end getDVD()
    
    
    
    }//end DVDOnlineStore

    Observe que la fuente de arriba es diferente del último proveedor. El método getDVD() devuelve una instancia de la clase de objeto de valor DVD recién creada en vez de una cadena convencional.

  4. Haga clic con el botón derecho en DVDOnlineStore.java y seleccione "Deploy as Web Service" ("Implementar como servicio web") del menú Web Services (servicios web). Luego haga clic en Next (Siguiente).

  5. Seleccione el componente JavaBean a exponer y haga clic en Next

    .
  6. Seleccione el estilo y uso del servicio web y haga clic en Finish. Este paso puede demorar un poco.

Prueba del servicio web

  1. Haga clic con el botón derecho en DVDOnlineStore.java y seleccione "Launch the Universal Test Client" ("Iniciar cliente de prueba universal") del menú Web Services (servicios web).

    Esto lo llevará directamente al explorador Web que muestra los servicios.

  2. Explore hasta llegar a su servicio haciendo clic en la referencia de objeto de DVDOnlineStore.

  3. Haga clic en el método getDVD y luego invoque el servicio haciendo clic en el botón Invoke (Invocar).

  4. Ya tiene una instancia del objeto DVD.

  5. Para recuperar información sobre el objeto DVD devuelto, es necesario hacer clic en su instancia, que le dará acceso a todos sus métodos.

  6. Para recuperar el título, haga clic en el método getTitle().

  7. Si aparece el mensaje de respuesta de "Fight Club", es porque el servicio ha sido probado y está activo y en funcionamiento. ¡Felicitaciones!

Laboratorio 3: Cliente de servicios web dinámico

Objetivo y generalidades del laboratorio

En un mundo ideal, usted debería ser el proveedor de servicios y el solicitante desarrollador de servicios. O, si esto no fuera así, el solicitante sería muy amable y le proporcionaría un archivo WSDL. Usted podría usar este archivo WSDL para generar stubs de cliente. (Nota: hay un tutorial llamado "Top-down Web service development: Build a WSDL file to generate a Web service using WebSphere Studio" que muestra cómo trabajar con archivos WSDL para generar código para el proveedor y para el solicitante (Ver Recursos). El asistente para servicios web oculta muchos detalles de WSDL.)

Sin embargo, el mundo está lejos de ser ideal. Y los proveedores de servicios pueden desarrollar servicios basados en SOAP sin archivos WSDL. Así es la vida. Entonces ¿cómo se invocan estos servicios? A través de una invocación SOAP dinámica.

Existen cuatro clases JAX-RPC que es necesario conocer para realizar una invocación dinámica:

  1. javax.xml.namespace.QName
  2. javax.xml.rpc.Call
  3. javax.xml.rpc.Service
  4. javax.xml.rpc.ServiceFactory

ServiceFactory es una clase abstracta que actúa como una fábrica de instancias para los servicios JAX-RPC. Service es una clase de fábrica para objetos Call. Service se usa para crear un objeto Call. Luego se le pasa al objeto Call su nombre de operación y su URL de extremo para que sepa dónde se ubica el servicio. El nombre de la operación se identifica con un QName. Un QName representa un nombre de elemento que está dentro de un espacio de nombres.

Repasemos todo esto con el código.

  1. Importe las clases necesarias:
    import javax.xml.namespace.QName; 
    import javax.xml.rpc.Call; 
    import javax.xml.rpc.Service; 
    import javax.xml.rpc.ServiceFactory;
    import javax.xml.rpc.ServiceFactory;
  2. Para crear un objeto de fábrica Service, es necesario pasarle el nombre completo del servicio web (es decir, espacio de nombres más nombre de servicio) al método createService(), como se indica a continuación:
    ServiceFactory serviceFactory = ServiceFactory.newInstance(); 
    String targetNamespace = "http://server.simplerpc.dvdonline.lpc"; 
    String serviceName = "DVDOnlineStore"; 
    Service service = serviceFactory.createService(new QName(namespace, serviceName));
  3. Use Service para crear el objeto de llamada:
    Call call = (Call) service.createCall();
  4. Establezca la ubicación URL de Service:
    String endpoint = "http://localhost:6080/SimpleRPC/services/DVDOnlineStore"; 
    call.setTargetEndpointAddress(endpoint);
  5. Invoque el objeto de llamada:
    String dvdName = (String)
                                call.invoke(null);

Creación del cliente de servicios dinámico para SimpleRPC

Ahora que ya sabe hacerlo, escribamos un cliente dinámico para el laboratorio SimpleRPC.

  1. Dentro del directorio package lpc\dvdonline\simplerpc\client, cree un archivo de origen Java llamado DynamicDVDOnlineStoreClient.java. Agregue el siguiente código a ese archivo de origen:
    package lpc.dvdonline.simplerpc.client;
    
    import javax.xml.namespace.QName;
    import javax.xml.rpc.Call;
    import javax.xml.rpc.ServiceFactory;
    import javax.xml.rpc.Service;
    
    public class DynamicDVDOnlineStoreClient {
    
    public static void main(String[] args) throws Exception {
    String targetNamespace = "http://server.complexrpc.dvdonline.lpc";
    String serviceName = "DVDOnlineStore";
    String endpoint =
    "http://localhost:9080/SimpleRPC/services/DVDOnlineStore";
    
    ServiceFactory serviceFactory = ServiceFactory.newInstance();
    Service service = serviceFactory.createService(
    new QName(targetNamespace, serviceName));
    
    /* Service access */
    Call call = (Call) service.createCall();
    call.setProperty(Call.ENCODINGSTYLE_URI_PROPERTY, "");
    call.setProperty(Call.OPERATION_STYLE_PROPERTY, "wrapped");
    call.setTargetEndpointAddress(endpoint);
    call.removeAllParameters();
    call.setPortTypeName(new QName(targetNamespace, serviceName));
    call.setOperationName(new QName(targetNamespace, "getDVD"));
    call.setReturnType(new QName("http://www.w3.org/2001/XMLSchema", "string"));
    
    /* Service invocation */
    System.out.println("Dynamic " + call.invoke(null));
    } //end main() 
    } // end DynamicDVDOnlineStoreClient
  2. Observe que el cliente no necesita las clases de stubs, interfaces y localizadores generadas por el asistente para servicios web.
  3. En primer lugar, para comprobar si el servidor funciona, haga clic en la flecha que está al lado del ícono del "corredor " y seleccione "WebSphere Test Environment" ("Entorno de prueba de WebSphere").

  4. Para ejecutar el cliente, haga clic en la flecha que está al lado del ícono del "corredor " en la barra de herramientas y elija "Run as > Java Application" ("Ejecutar como > Aplicación Java")

Si puede ver el mensaje de respuesta de "Dynamic Fight Club", se ha ganado el cinturón marrón de Kung Fu de los servicios web.

Clientes dinámicos con tipos complejos

Muy bien, ya puede invocar servicios web que devuelven tipos simples y tienen argumentos simples, pero ¿qué pasaría si el servicio web tuviera tipos complejos como los de este ejemplo? En pocas palabras: el ejemplo dinámico se vendría abajo. Hasta ahora pudimos realizar tareas dinámicas de una manera independiente del proveedor. Pero cuando comenzamos a trabajar con tipos complejos, el uso del mecanismo dinámico se vuelve más específico del proveedor. Esto se corregirá en futuras versiones de la API JAX-RPC.

En Application Developer es necesario registrar un serializador y deserializador personalizado para los tipos complejos. Es algo muy fácil de hacer. Por motivos de integridad, crearemos un cliente dinámico para el ejemplo complejo.

Creación del cliente de servicio dinámico para ComplexRPC

  1. Dentro del directorio package lpc\dvdonline\complexrpc\client, cree un archivo de origen Java llamado DynamicDVDOnlineStoreClient.java. Agregue el siguiente código al archivo de origen:
    package lpc.dvdonline.complexrpc.client;
    
    import javax.xml.namespace.QName;
    import javax.xml.rpc.Call;
    import javax.xml.rpc.Service;
    import javax.xml.rpc.ServiceFactory;
    import javax.xml.rpc.encoding.TypeMapping;
    import javax.xml.rpc.encoding.TypeMappingRegistry;
    
    import lpc.dvdonline.complexrpc.service.DVD;
    
    import com.ibm.ws.webservices.engine.encoding.ser.BeanDeserializerFactory;
    import com.ibm.ws.webservices.engine.encoding.ser.BeanSerializerFactory;
    
    
    public class DynamicDVDOnlineStoreClient {
    
    public static void main(String[] args) throws Exception { 
    String namespace = "http://server.complexrpc.dvdonline.lpc";
    String serviceName = "DVDOnlineStoreService";
    String endpoint = "http://localhost:6080/ComplexRPC/services/DVDOnlineStore";
    
    /* Service lookup */
    Service service = ServiceFactory.newInstance().createService(
    new QName(namespace, serviceName));
    
    // Define and register the type mapping
    TypeMappingRegistry tmr = service.getTypeMappingRegistry();
    TypeMapping tm = tmr.createTypeMapping();
    QName dvdQName = new QName(namespace, "DVD");
    tm.register(DVD.class, dvdQName,
    new BeanSerializerFactory(DVD.class, dvdQName),
    new BeanDeserializerFactory(DVD.class, dvdQName));
    tmr.register("", tm);
    
    /* Service access */
    Call call = (Call) service.createCall(); 
    call.setProperty(Call.ENCODINGSTYLE_URI_PROPERTY, ""); 
    call.setProperty(Call.OPERATION_STYLE_PROPERTY, "wrapped"); 
    call.setTargetEndpointAddress(endpoint);
    call.setReturnType(dvdQName,DVD.class); 
    call.setPortTypeName(new QName(namespace, serviceName)); 
    call.setOperationName(new QName(namespace, "getDVD")); 
    
    /* Service invocation */
    DVD dvd = (DVD) call.invoke(null);
    System.out.println("Dynamic DVD Title " + dvd.getTitle()); 
    
    //end main()
    } //end DynamicDVDOnlineStoreClient
    }
  2. Para ejecutar el cliente, haga clic en la flecha que está al lado del ícono del "corredor " en la barra de herramientas y elija "Run as > Java Application" ("Ejecutar como > Aplicación Java")

Si puede ver el mensaje de respuesta de "Dynamic DVD Title Fight Club", es un maestro de Kung Fu de los servicios web. ¡Felicitaciones!


Conclusión y recursos

Revisión del tutorial

En este tutorial, usted:

  • Aprendió a usar JSR-101/JAX-RPC.
  • Aprendió a usar las herramientas de WebSphere Studio Application Developer Integration Edition para crear servicios web al estilo RPC.
  • Creó, implementó y consumió un servicio web con tipos simples.
  • Creó, implementó y consumió un servicio web con tipos complejos.
  • Creó clientes dinámicos que usan tipos simples y complejos.

Usted ya dispone de un buen punto de partida para el desarrollo con servicios web. Aquí se demostró que es posible desarrollar con servicios web usando las especificaciones y herramientas disponibles. Algunas empresas ya están usando estos tipos de servicios web para integrar sus sistemas en toda la organización y para hacerlo con socios, proveedores y clientes. Los servicios web se están convirtiendo en una tecnología fundamental en la Integración de aplicaciones empresariales (EAI).

En futuros tutoriales, exploraremos temas más complejos, como las interfaces entre el agregador y dos proveedores de alquiler de DVD, así como el descubrimiento de esas interfaces por medio de UDDI a partir del agregador.


Descargar

DescripciónNombretamaño
Source code for this tutorialws-soa-2code.zip2945KB

Recursos

Aprender

Obtener los productos y tecnologías

Comentar

Comentarios

developerWorks: Ingrese

Los campos obligatorios están marcados con un asterisco (*).


¿Necesita un IBM ID?
¿Olvidó su IBM ID?


¿Olvidó su Password?
Cambie su Password

Al hacer clic en Enviar, usted está de acuerdo con los términos y condiciones de developerWorks.

 


La primera vez que inicie sesión en developerWorks, se creará un perfil para usted. La información en su propio perfil (nombre, país/región y nombre de la empresa) se muestra al público y acompañará a cualquier contenido que publique, a menos que opte por la opción de ocultar el nombre de su empresa. Puede actualizar su cuenta de IBM en cualquier momento.

Toda la información enviada es segura.

Elija su nombre para mostrar



La primera vez que inicia sesión en developerWorks se crea un perfil para usted, teniendo que elegir un nombre para mostrar en el mismo. Este nombre acompañará el contenido que usted publique en developerWorks.

Por favor elija un nombre de 3 - 31 caracteres. Su nombre de usuario debe ser único en la comunidad developerWorks y debe ser distinto a su dirección de email por motivos de privacidad.

Los campos obligatorios están marcados con un asterisco (*).

(Por favor elija un nombre de 3 - 31 caracteres.)

Al hacer clic en Enviar, usted está de acuerdo con los términos y condiciones de developerWorks.

 


Toda la información enviada es segura.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=90
Zone=SOA y servicios web
ArticleID=681886
ArticleTitle=Generación de SOA con servicios web mediante WebSphere Studio, parte 2: Creación de un servicio web a partir de una clase Java
publish-date=08052011