LLAMADA ASINCRONA A WEB SERVICE


03 de Marzo del 2017

Buenos Dias

Estoy programando una consume de un servicio web y los resultados los inserta en una base de datos. Lo estoy haciendo mediante hilos el caso es que me va muy lenta y queria probar a llamar al servicio web de forma asincrona, pero no se como se hace. Os muestro mi codigo , La clase que consume el web service es :

public class WebServiceConsulta
{
private EnviaSIA resultado;
private String user;
private String password;
private URL urlconsulta;


public WebServiceConsulta(){

ResourceBundle props = null;
try {
props = new PropertyResourceBundle(
WebServiceConsulta.class.getResourceAsStream("/webServiceConstant.properties"));
} catch (IOException ioe) {
throw new IllegalStateException("Error al leer propiedades", ioe);
}

// Clave del certificado a usar dentro del KeyStore
user = props.getString("user.consulta");
password = props.getString("password.consulta");
String consultaEndPoint=props.getString("endpoint.consulta");
urlconsulta= null;

try {
urlconsulta = new URL(consultaEndPoint);

} catch (MalformedURLException e1) {
e1.printStackTrace();
e1.getMessage();
}
}

public EnviaSIA webservice (int año, String sia)
{

 

/** Añadimos los parametros de entrada del servicio **/
ParamSIA parametros = new ParamSIA();


parametros.setUser(user);
parametros.setPassword(password);
Filtro filtro= new ParamSIA.Filtro();
filtro.setAnioVolTramitaciones(String.valueOf(año));
filtro.setCodigoActuacion(sia);
filtro.setMostrarOtrosDatos("S");
filtro.setObtenerBajas("S");
parametros.setFiltro(filtro);

try
{
WsSIAConsultarActuacionesIdentificacion_Service servicio= new WsSIAConsultarActuacionesIdentificacion_Service(urlconsulta);
resultado=servicio.getWsSIAConsultarActuacionesIdentificacionSOAP().consultarSIAV30(parametros);

 

}catch (Exception e){
e.getMessage();
return resultado;
}

return resultado;
}

 

 


}

 

Mientras que desde la clase principal del hilo hago una llamada a insertar Procedimiento que es el que consume el web service . de la siguiente manera.
public void run() {
try {

log.debug("F_ run() " + this.getName() + " " + this.procedimientoAuxiliar.getAccionRunEjecutar());

if (session != null){
session.close();
}
if (session == null)
{
log.debug("Se abre la sesion de bbdd");
session = sessionFactory.openSession();
}

log.debug("Se activa el metodo flush()");
session.setFlushMode(FlushMode.ALWAYS);

log.debug("Antes de entrar a insertar procedimiento");
//Llamamos al web service de consulta pasandole el año y el numero sia como parámetros de entrada
insertaProcedimiento(wscons.webservice(año, sia), año, procedimientoAuxiliar, session, tx);

log.debug("Se mata el hilo");
stop(Thread.currentThread());


} catch (Exception e) {
// TODO Auto-generated catch block
log.error("Se ha producido un error en el metodo Run de los hilos" + e.getMessage());
}finally{

//cerramos la sesion
log.debug("Se cierra la sesion de bbdd");
if (session !=null)
{
session.close();
}
//Liberamos el semáforo se produzca o no excepción
log.debug("Se libera el semáforo");
this.semaforo.release();
}

}

 

ALGUNA IDEA PARA LLAMAR AL WEB SERVICE DE FORMA ASINCRONA???????. Agradezco toda la informacion posible gracias

 



06 de Julio del 2017

Lo que debes implementar es Thread, que ejecute cada una de tus metodos que consume el webservice y guardan en base de datos, esto es lo sencillo lo complicado puede venir en como quieres que responda esos thread cuando terminen, es decir como se unen en el flujo principal, a lo que te sugiero que te preguntes lo siguiente:

¿Al hacer una llamada al webservice, no me importa que me notifique cuando termine, es decir no mostrara ningun mensaje en pantalla?

¿existe alguna depedencia entre tus metodos que llaman al webservice o todos son independientes entre  si?

dependiendo de esas respuesta asi es la forma que vas a implementar los thread, que puede ir de un simple

Thread t=new Thread(new Runnable(){ public void run(){ metodo_de_llamada_a_webservice();}};

t.start(), a algo mucho mas elaborado.

 

te dejo algunos links de como implementar thread en java que te daran más luz sobre el tema.

https://jarroba.com/multitarea-e-hilos-en-java-con-ejemplos-thread-runnable/

https://www.adictosaltrabajo.com/tutoriales/el-paralelismo-en-java-y-el-framework-forkjoin/

 

saludos.