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.

No hay comentarios: