Mostrando entradas con la etiqueta AXIS1. Mostrar todas las entradas
Mostrando entradas con la etiqueta AXIS1. Mostrar todas las entradas

sábado, 18 de agosto de 2012

APLICACIÓN DE "TIMEOUT" EN "PROXY CLIENT" CON "AXIS 1.4"

En esta oportunidad mostraré algo muy requerido y necesario cuando se consumen WebService, a lo que me refiero es a la aplicación de los famosos TIMEOUT control de cada WebService consumido por medio de lo "Proxy Client" generados.

En esta oportunidad mostraré el manejo de dicho TimeOut por medio del FrameWork AXIS 1.4, un FrameWork no tan power como JaxWS pero que buen y aun muy usado en el mercado mundial.

Aquí muestro el contenido completo de la clase JAVA: TestProxyAxis1 , en donde limplemento el Cliente que consume un supuesto WebService: http://localhost:7001/ObtenerTecnologiaWS/ObtenerTecnologiaService?wsdl, al cual se le envía un numero telefónico y este responde con el tipo de Tecnología (El WS no es parte de este ejemplo planteado). Se debe de suponer que previamente uno ya ha tenido que crear el "Proxy Client" (.jar), para poder consumir el Servicio Web.

EJEMPLO:

import java.net.SocketTimeoutException;
import java.net.URL;
import javax.xml.rpc.ServiceException;
import org.apache.axis.AxisFault;
import externalCompany.com.pe.bean.ObtenerTecnologiaRequest;
import externalCompany.com.pe.bean.ObtenerTecnologiaResponse;
import externalCompany.com.pe.bean.TransaccionBean;
import externalCompany.com.pe.bean.ObtenerTecnologiaWS.ObtenerTecnologiaBindingStub;
import externalCompany.com.pe.bean.ObtenerTecnologiaWS.ObtenerTecnologiaInput;
import externalCompany.com.pe.bean.ObtenerTecnologiaWS.ObtenerTecnologiaOutput;
import externalCompany.com.pe.bean.ObtenerTecnologiaWS.ObtenerTecnologiaServiceLocator;

/**
 * @author cguerra.
 * @clase: TestProxyAxis1.java 
 * @author_company: nombre de la compañía del autor.
 * @fecha_de_creación: dd-mm-yyyy.
 * @fecha_de_ultima_actualización: dd-mm-yyyy.
 * @versión 1.0
 */
 public class TestProxyAxis1{

   /**
    * @param argumentos
    */
    public static void main( String ... argumentos ){

        String URL_ENDPOINT = "http://localhost:7001/ObtenerTecnologiaWS/ObtenerTecnologiaService?wsdl";
       
        ObtenerTecnologiaServiceLocator objLocator = null;
        ObtenerTecnologiaBindingStub      objBinding = null;
       
        ObtenerTecnologiaInput          objInput    = null;
        ObtenerTecnologiaRequest    objRequest  = null;
        ObtenerTecnologiaOutput       objOutput   = null;
        ObtenerTecnologiaResponse objResponse = null;
       
        try{
            objLocator = new ObtenerTecnologiaServiceLocator();
            objBinding = (ObtenerTecnologiaBindingStub)objLocator.getObtenerTecnologiaPort( new URL( URL_ENDPOINT ) );
           
            //TIMEOUT:
            setTimeOutWS( objBinding );
           
            objInput          = new ObtenerTecnologiaInput();            
            objRequest    = new ObtenerTecnologiaRequest();   
            objOutput       = new ObtenerTecnologiaOutput();
            objResponse  = new ObtenerTecnologiaResponse();
                                   
            objInput.setParam_Request( objRequest );
                       
            //INPUT:
            objRequest.setTelefono( "52148652" );
            objInput.setParam_Request( objRequest );           
           
            //WEBSERVICE:
            objOutput      = objBinding.obtenerTecnologia( objInput );           
            objResponse = objOutput.getParam_Response();
           
            //OUTPUT:
            String          tecnologia       = objResponse.getTecnologia();
            TransaccionBean objTransaccionBean = objResponse.getTransaccionBean();
            String          codigo             = objTransaccionBean.getCodigo();
            String          mensaje          = objTransaccionBean.getMensaje();
           
            System.out.println( "- TECNOLOGIA: " + tecnologia );
            System.out.println( "- CODIGO:     " + codigo  );
            System.out.println( "- MENSAJE:    " + mensaje );
        }
        catch( ServiceException e ){
               System.out.println( "ERROR:[ServiceException] " + e );
        }
        catch( AxisFault e ){
               System.out.println( "ERROR:[AxisFault] " + e );
        }
        catch( Exception e ){
               System.out.println( "ERROR:[Exception] " + e );
        }
    }
   
   /**
    * setTimeOutWS   
    * @param  objBinding
    * @throws Exception
    */
    public static void setTimeOutWS( ObtenerTecnologiaBindingStub objBinding ) throws Exception{ 
       
        try{
            javax.xml.rpc.Stub          objStub_RPC  = (javax.xml.rpc.Stub)objBinding;        
            org.apache.axis.client.Stub  objStub_AXIS = (org.apache.axis.client.Stub)objBinding;
           
            int timeOut = (5 * 1000);  //5 segundos
            
            //----- FORMA #1: -----//
            objStub_RPC._setProperty( "axis.connection.timeout", timeOut );
           
            //----- FORMA #2: -----//
            objStub_AXIS.setTimeout( timeOut );
           
            //----- FORMA #3: -----//       
            objBinding._setProperty( org.apache.axis.client.Call.CONNECTION_TIMEOUT_PROPERTY, timeOut ); 
        }
        catch( Exception e ){
               throw new SocketTimeoutException();
        }       
    }
   
}

El método:  setTimeOutWS recibe solo el Binding y es reutilizado para desde cualquier lugar aplicar un TIMEOUT de 3 formas distintas (uno ya escoge cual de ellas usar).

Saludos.

jueves, 17 de mayo de 2012

GENERADOR DE OBJETOS JAVA DESDE WSDL [MAVEN]


Hola chicos en esta oportunidad postearé, sobre un utilitario que manejo para el manejo de WebService. Todos sabrán que ahora el manejo de los Servicios Web esta muy de moda, sobre todo como una fuerte modalidad de INTEGRACION de sistemas legacy con otros tipos de sistemas, en IDEs de INTEGRACION como IBM Websphere Message Broker o el OSB de ORACLE. La cuestión es que en el mercado existen muchos Frameworks para la generación de WebService y Proxys (Clientes WS) tales como: AXIS, AXIS2, JAXRPC, JAXWS, uno mas antiguos que otros y otros mejores que otros. Por motivos de trabajo he tenido la necesidad que trabajar con todos y los conozco bien pero particularmente prefiero por motivos de mejor generación de objetos, mantenibilidad, etc JAXWS.

Una cosa que no me gusta es que por ejemplo las IDES como ECLIPSE, JDEVELOPER, etc no tienen el soporte a todas estos Frameworks y constantemente uno tiene que bajar un plugin o sino manejar varias herramientas por ejemplo ECLIPSE soporta WS embebido con AXIS solamente y si quiero trabajar con JAXWS me tengo que apoyar en por ejemplo el WID de IBM que lo tiene embebido y si quiero AXIS2 bajarme un plugin adicional. Algo similar pasa con JDeveloper. Por otro lado, el manejo de Wizards como que nunca me gusto mucho así que para mi la modalidad compartida a continuación es la mas optima.

Lo que manejo es un proyecto de tipo MAVEN, que solo lo utilizo como Generador de Objetos y clases JAVA en base al WSDL (en FISICO o URL) respectivamente. Esto lo hago mediante Plugins de MAVEN para cada tipo diferente de FRAMEWORK.

ESCENARIO #1:  "Tengo un WSDL y requiero hacer un WS o un PROXY". Que necesito GENERAR el WS o el PROXY (Independientemente de lo que necesite) en base al WSDL (esto es lo mejor osea tener ya creado el WSDL).

SOLUCION #1: Apoyarnos en una o varias IDEs dependiendo de que Framework querer usar y realizar dicha generación.
SOLUCION #2: Bajarnos los comprimidos de cada Framework, mapearlos en variables de entorno y ejecutar los comandos respectivos por tipo de Framework desde consola.
SOLUCION #3: Trabajar con la solución  planteada  WSDL_MavenGenerator_JaxWs_Axis1_Axis2.zip. Ya que solo requiere 2 cosas: Que tengas tu MAVEN configurado y cambiar el plugin del POM.xml en base al framework deseado, de donde de: resources/IMPORTANTE.txt y listo se genera el paquete de clases y objetos requeridos para que los cortes y lo lleves a tu proyecto JAVA donde trabajaras. Ya no necesitaras varias IDES ni nada en un PROYECTO MAVEN lo tienes todo para generar con: AXIS, AXIS2 y JAXWS.

Aqui les comparto los PLUGINs manejados (Por Motivos del BLOG, he cambiado los simbolos de MAYOR / MEJOR por corchetes):

  
     //------------------------------------------------------------------------//
     //----------------------- PLUGIN: JAXWS -----------------------//
     //------------------------------------------------------------------------//

     [!-- GENERACION DE CLASES .JAVA (JAXWS), EN BASE AL [.WSDL] --]
     [plugin]
        [groupId]:[/groupId]
        [artifactId]jaxws-maven-plugin[/artifactId]
        [executions]
           [execution]
              [goals]
                 [goal]wsimport[/goal]
              [/goals]
           [/execution]
        [/executions]
        [configuration]
           [!-- ASIGNACION DE [PAQUETE] DE CLASES GENERADAS --]
           [packageName]pe.com.javaman.dummy.jaxws[/packageName]
           [wsdlDirectory]src/main/webapp/wsdl[/wsdlDirectory]
           [sourceDestDir]src/main/java[/sourceDestDir]
           [!-- keep=true: MAVEN mantiene FUENTES. keep=false: MAVEN regenera FUENTES. --]
           [keep]false[/keep]
           [verbose]true[/verbose]
        [/configuration]
     [/plugin]
   
   
     [!-- GENERACION DE CLASES .JAVA (MAPPING JAXWS), EN BASE A LA [URL]  --]
     [plugin]
        [groupId]org.codehaus.mojo[/groupId]
        [artifactId]jaxws-maven-plugin[/artifactId]
        [executions]
            [execution]
                [goals]
                   [goal]wsimport[/goal]
                [/goals]
                [configuration]
                    [!-- ASIGNACION DE [PAQUETE] DE CLASES GENERADAS --]
                    [packageName]pe.com.javaman.dummy.jaxws[/packageName]
                    [wsdlUrls]
                      [wsdlUrl]http://localhost:8090/GestionDatosUsuarioWS/GestionDatosUsuarioWSService?wsdl[/wsdlUrl]
                    [/wsdlUrls]
                    [sourceDestDir]src/main/java[/sourceDestDir]
                    [!-- keep=true: MAVEN mantiene FUENTES. keep=false: MAVEN regenera FUENTES. --]
                    [keep]false[/keep]
                    [verbose]true[/verbose]
                [/configuration]
            [/execution]
        [/executions]
     [/plugin]

     //----------------------------------------------------------------------//
     //----------------------- PLUGIN: AXIS1 -----------------------//
     //----------------------------------------------------------------------//

     [!-- GENERACION DE CLASES .JAVA (AXIS1), EN BASE AL [.WSDL] --]
     [plugin]
        [groupId]org.codehaus.mojo[/groupId]
        [artifactId]axistools-maven-plugin[/artifactId]
        [version]1.4[/version]
        [executions]
          [execution]
            [goals]
              [goal]wsdl2java[/goal]
            [/goals]
          [/execution]
        [/executions]
        [configuration]
           [!-- ASIGNACION DE [PAQUETE] DE CLASES GENERADAS --]
           [packageSpace]pe.com.javaman.dummy.axis1[/packageSpace]
           [sourceDirectory]src/main/webapp/wsdl/[/sourceDirectory]
           [outputDirectory]src/main/java[/outputDirectory]
           [helperGen]true[/helperGen]
           [verbose]true[/verbose]
        [/configuration]
     [/plugin]
   
     [!-- GENERACION DE CLASES .JAVA (AXIS1), EN BASE AL [.URL] --]
     [plugin]
        [groupId]org.codehaus.mojo[/groupId]
        [artifactId]axistools-maven-plugin[/artifactId]
        [version]1.4[/version]
        [executions]
          [execution]
            [goals]
              [goal]wsdl2java[/goal]
            [/goals]
          [/execution]
        [/executions]
        [configuration]
           [!-- ASIGNACION DE [PAQUETE] DE CLASES GENERADAS --]
           [packageSpace]pe.com.javaman.dummy.axis1[/packageSpace]       
           [urls]
             [url]http://localhost:8090/GestionDatosUsuarioWS/GestionDatosUsuarioWSService?wsdl[/url]
           [/urls]
           [outputDirectory]src/main/java[/outputDirectory]
           [helperGen]true[/helperGen]
           [verbose]true[/verbose]
        [/configuration]
     [/plugin]

     //-----------------------------------------------------------------------//
     //----------------------- PLUGIN: AXIS2 -----------------------//
     //----------------------------------------------------------------------//
   
     [!-- GENERACION DE CLASES .JAVA (AXIS2), EN BASE AL [.WSDL] --]
     [plugin]
        [groupId]org.apache.axis2[/groupId]
        [artifactId]axis2-wsdl2code-maven-plugin[/artifactId]
        [version]1.5.4[/version]
        [executions]
            [execution]
                [goals]
                    [goal]wsdl2code[/goal]
                [/goals]
            [/execution]
        [/executions]
        [configuration]
            [!-- ASIGNACION DE [PAQUETE] DE CLASES GENERADAS --]
            [packageName]pe.com.javaman.generate.axis2[/packageName]
            [wsdlFile]src/main/webapp/wsdl/GestionDatosUsuarioWSService.wsdl[/wsdlFile]
            [outputDirectory]src/main/[/outputDirectory]
            [targetSourceFolderLocation]java[/targetSourceFolderLocation]
            [databindingName]xmlbeans[/databindingName] 
            [unpackClasses]true[/unpackClasses]
            [verbose]true[/verbose]     
            [options]
               [uwc]true[/uwc]
            [/options]        
        [/configuration]          
     [/plugin]

     [!-- GENERACION DE CLASES .JAVA (AXIS2), EN BASE AL [.URL] --]
     [plugin]
        [groupId]org.apache.axis2[/groupId]
        [artifactId]axis2-wsdl2code-maven-plugin[/artifactId]
        [version]1.5.4[/version]
        [executions]
            [execution]
                [goals]
                    [goal]wsdl2code[/goal]
                [/goals]
            [/execution]
        [/executions]
        [configuration]
            [!-- ASIGNACION DE [PAQUETE] DE CLASES GENERADAS --]
            [packageName]pe.com.javaman.generate.axis2[/packageName]
            [wsdlFile]http://localhost:8090/GestionDatosUsuarioWS/GestionDatosUsuarioWSService?wsdl[/wsdlFile]
            [outputDirectory]src/main/[/outputDirectory]
            [targetSourceFolderLocation]java[/targetSourceFolderLocation]
            [databindingName]xmlbeans[/databindingName] 
            [unpackClasses]true[/unpackClasses]
            [verbose]true[/verbose]     
            [options]
               [uwc]true[/uwc]
            [/options]        
        [/configuration]          
     [/plugin]


Para poder descargar el generador de WSDL pulsar: WSDL_MavenGenerator_JaxWs_Axis1_Axis2.zip


Saludos.



lunes, 1 de junio de 2009

MANEJO DE 'WEB SERVICE' CON 'AXIS1'.

Ultimamente en mi nuevo trabajo me solicitaron la integracion de dos sistemas que trabajaban por separado y analizando decidi aplicar 'Web Service'(WS), asi que buscando decidi aplicar este muy buen Framework para manejo en JAVA de Web Service 'AXIS1'. El ejemplo presentado acontinuaciòn consiste en dos proyectos JAVA:

1.- Ejemplo_ServidorWS_AXIS1:
- Posee clases de conexion a MySql.
- Posee un Patròn DAO y las Interfaces respectivas.
- Posee Servicios de acceso.
- Aqui se genarara el 'WSDL'(Que es un XML mapeado con los paràmetros que accederàn de un sistema al otro), mediante la herramienta que brinda Eclipse.

2.- Ejemplo_ClienteWS_AXIS1:
- Posee dos ejemplos de Cliente 'Web Service', el primero generado mediante la herramienta del Eclipse para generar un 'Cliente WS' en base al 'WSDL' ya creado, y el segundo cliente es en base varias clases que brinda 'AXIS' para el acceso automàtico en base a solo el nombre de la ruta del 'WSDL' en String.

Datos Importante (Sobre el Ejemplo a Descargar):
- El ejemplo del manejo de Web Service esta preparado para correr con platformas JAVA v1.5 y v1.6 (Aqui se debe quitar de a carpeta 'lib': jsp-api.jar y servlet.jar ya que vienen dentro del 'JDK-1.6' sino crea conflicto y no levantar la aplicaciòn), trabaja con una conexion a MySql (El Stript se encuentra dentro del Aplicativo Servidor) y fue desarrollado en Eclipse v3.3.

- Para levantar el 'Web Service', se tiene que tener ya un proyecto Java listo con las conexion a MySql, que trabajara como 'Servidor' y en base a la Implementacion de una Interface 'DAO' o la de un 'Servicio' se generara el 'WSDL', donde se mapearan los datos de entrada y salida para la interconexion de los sistemas. (Al correr la aplicaciòn con el Tomcat, se levanta junto con la aplicacion el servicio 'WSDL'). Ver imagenes:

Se muestra el arbol de la aplicaciòn que servirà de Servidor para el 'WS'.

Comenzamos a generar el 'WS' con la herramienta de Eclipse.

Seguir pasos que se muestran en la imagen.

Chequear los mètodos que serviràn para la generaciòn del 'WS'
(Seran mapeados en el XML).

Iniciar el Servidor y pulsar finalizar.

Se levantarà la aplicaciòn y se mostrarà una pàgina 'JSP'.

Del 'WDSL' generado obtendremos la ruta del del 'WSDL' para probar si el servicio esta iniciado.

A la vez que se levanta el servidor se inicia el Servicio del 'WS'. Observemos el 'WSDL' generado agregando al link el '?wsdl'.

Luego de esto, para generar el cliente con la herramienta que facilita el Eclipse
copiamos la carpeta 'WSDL' con todo su contenido del Proyecto Java que sirve de 'Servidor' al proyecto que servirà de 'Cliente' y del 'UsuarioDaoImpl.wsdl' generar las clases base.


Dar los cheks respectivos que se muestran en la imagen.

Se muestra la ubicaciòn donde se generà las clases de apoyo al 'WS' (org.java.dao) en la aplicacion 'Cliente'.

Se muestran las clases generadas en el proyecto Cliente 'WS'.

Luego de estos pasos, ya podemos trabajar con el cliente 'WS'. Mostrarè dos formas de realizar un cliente 'WS' para realizar un mantenimiento via 'WS', los procesos seràn los siguientes y se ejecutaràn en base al orden que sean descomentados:

/********** PROCESOS 'WS' **********/
clienteWS.registrarUsuario( accesoWS );
//clienteWS.modificarUsuario( accesoWS );
//clienteWS.eliminarUsuario( accesoWS );
//clienteWS.obtenerObjetoUsuario( accesoWS );
//clienteWS.obtenerListaObjetosUsuario( accesoWS );
/**************************************/

1.- Cliente 'WS' en base a las clases generadas:'src.org.java.client.ClienteWS_Generado.java', utiliza las clases generadas por Eclipse para conectarse al 'WSDL'.

2.- Cliente 'WS' de acceso automàtico sin utilizar ninguna clase generada:'src.org.java.client.ClienteWS.java', no necesita ninguna clase sino que utiliza las Clases que brinda AXIS para el acceso automàtico, necesitando simplemente la ruta del 'WSDL' en String.

Para mayor detalle descargar el ejemplo completo: AQUI.