CRON , procesos en segundo plano con Spring (SchedulerFactoryBean)

Spring nos aporta muchas utilidades , entre ellas utilidades para correr procesos en segundo plano (demonios). Estos permite configurarlos de manera flexible, indicando cuando deben arrancar, cada cuanto tiempo realizar determinada tarea, etc....


Para ello es necesario meter en el contexto un bean del tipo org.springframework.scheduling.quartz.SchedulerFactoryBean
Este bean tiene una propiedad "triggers" en la cual le especificamos que Triggers va a manejar

Vamos por partes:
Esto es tan sencillo como meter en nuestro ApplicationContext.xml la definicion del bean especificar un trigger :





     <!-- Spring Bean para control de crons -->
    <bean id="kuyiSchedulerFactoryBean" class="org.springframework.scheduling.quartz.SchedulerFactoryBean" >
<property name="triggers" >
<list>
<ref bean="accionBatchTrigger" /> <!--REf al bean que sera Trigger-->
<!--mete aqui todos los que quieras-->
</list>
</property>
</bean>




Vemos el bean definido y en los triggers le definimos que triggers va a lanzar. Ahora definimos un Bean de tipo "SimpleTriggerBean" que es al que hace referencia. Los triggers son objetos en los que ya podemos definir propiedades del estilo, cuando se lanza, cuantas veces, intervalo de ejecucion, etc....
Asi que esto quedaria algo asi:




     <!-- 1. Cada 1 minuto hace una accion -->
    <bean id="accionBatchTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean" >
<!-- Nombre del bean que debe ejecutar la accion -->
<property name="jobDetail" ref="taskaccionBatchTrigger" />
<!-- inicia a los 10 segundos, su primera ejecucion-->
<property name="startDelay" value="10000" />
<!-- repite cada 60 segundos /1 minuto -->
<property name="repeatInterval" value="3600" />
</bean >


Vemos que el nombre del trigger es la referencia que metimos en la factoria de tareas Scheduler (SchedulerFactoryBean)  Vemos que tiene 3 propiedades : startDelay (tiempo para su primera ejecucion)
repeatInterval: tiempo cada cuanto se lanza y jobDetail: que es la referencia al Bean que se ejecutara.


Muy bien ahora vamos a definir el jobDetail. Este debe ser un bean del tipo "MethodInvokingJobDetailFactoryBean". Lo pongo y comentamos las propiedades:



              <bean id="taskaccionBatchTrigger" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean" >
<!-- referencia al bean del contexto que ejecutara la accion Finalmente -->
<property name="targetObject" ref="cronRealizaAccion" />
<!-- El metodo de la clase que se ejecutara -->
<property name="targetMethod" value="executeActionCron" />
<property name="concurrent" value="false" />
</bean >


Es muy sencillo, tiene el targetObject :que es el Bean real de nuestra aplicacion que ejecutara la accion. y targetMethod, es el metodo de la clase que se ejecutara.

Y ahora ya la definicion de nuestro bean (lo pongo como seria en el xml, pero puedes meterlo en el contexto con anotaciones o como quieras:

<bean id="cronRealizaAccion" class="com.dppware.pruebas.cronRealizaAccion" />









Comentarios

Entradas populares de este blog

Subir campos Blob a BBDD (Oracle) con Java

Reiniciar usuario de SVN Subversion

Cucumber y Java - definiendo test de una manera amigable