Banear

sábado, 13 de abril de 2013

The Working Thread: Creación y manejo de hilos paralelos con Java, Spring y Wicket

A veces, en nuestras aplicaciones web, nos puede interesar lanzar un proceso en "background" para actualizar datos de una tabla o cualquier otra tarea cuya ejecución pueda tardar bastantes segundos y sea conveniente lanzarla de forma asíncrona. Para hacer esto tenemos unas cuantas opciones:
  • En versiones actuales de Spring, usando anotaciones, podemos marcar como @Async aquellos métodos que deseemos que se ejecuten de forma asíncrona en el servidor.
  • Crear un proceso batch (con spring-batch o de forma "tradicional") que planificaremos para lanzarlo cada x minutos con Control-M, por ejemplo.
  • Si no usamos Spring, en las nuevas versiones de J2EE, se pueden anotar métodos como tareas a ejecutar periódicamente cada x minutos.
  • Crear hilos paralelos en el cliente, si optamos por esta solución, hay que tener en cuenta si es la apropiada para nuestro caso:
  1. Crearemos una clase "TheWorkingThread" que extenderá de Thread.
  2. En dicha clase, declararemos un constructor al que le pasaremos como parámetro un objeto perteneciente a la clase de nuestro servicio: public TheWorkingThread(WcService wcService){//...} y un atributo private WcService wcService; que inicializaremos en el constructor con el servicio que nos pasan como parámetro.
  3. En el contenido del método run(), colocaremos nuestra tarea, por ejemplo una llamada al método de nuestro servicio: wcService.tirarCadenaWc()
  4. Desde fuera del hilo, en nuestro caso en una clase que se ejecutaría en el hilo de Wicket, iniciaríamos el hilo a través del método start(), que ejecuta el método run() de TheWorkingThread en paralelo, de forma que el hilo de Wicket no tiene que esperar a que acabe la ejecución de TheWorkingThread.
  5. Hasta aquí, no hay ninguna novedad respecto al tratamiento habitual de hilos en Java (debéis tener en cuenta si necesitais sincronizar vuestros hilos si no son independientes o utilizais variables estáticas, si quereis reutilizar los hilos instanciados usando un pool de éstos y otras mejoras asociadas a evitar sorpresas en las ejecuciones y rendimiento de los hilos).
  6. La novedad para Wicket es que si vais a crear un hilo paralelo en el que necesitais acceder a un servicio declarado en el contexto de Spring con Wicket, debéis hacer lo siguiente, si no queréis que os salgan los errores asociados al Proxy:
Application application = ((Application) getApplication());
ServletContext sc = application.getServletContext();
WebApplicationContext ctx = WebApplicationContextUtils.getWebApplicationContext(sc);
WcService wcService = (WcService)(ctx.getBean("wcService",WcService.class));

Así es como se debería obtener el wcService para pasárselo al constructor del hilo y no tener problemas con el Proxy. Cuando me refiero al proxy, hablo del de Spring, obviamente no tiene nada que ver con el de vuestra conexión a Internet (aunque la idea es parecida, un objeto que simula ser el objeto final pero realmente es un intermediario) :)





lunes, 1 de abril de 2013

Ruta Ferrol - Chamorro - Caminata

Hoy, día 1 de Abril es la festividad de Chamorro. Así que de propina, cuelgo por aquí la ruta:

Distancia aproximada: 12km
Tiempo aproximado andando: 2.5h
Dificultad: Media-Baja

Mapa

Perfil

Tracks