planetarioCuando desarrollamos aplicación con spring, quartz y la configuración de los jobs queda empaquetada en la aplicación, resulta bastante molesto tener que cambiar la configuración, recompilar y desplegar nuevamente la aplicación, en algunos casos hasta se tiene que volver a la configuración inicial luego de una sola ejecución. Para no tener que caer en esto, nos podemos valer de JMX y exponer el bean que contiene el método que es ejecutado por quartz.

Hay que tener en cuenta que esta ejecución, en el caso de que quartz este configurado para dejar registro de las corridas en la BD, no quedara registrada en las tablas de control de quartz.

 
<!-- Bean que contiene el método holaMundo ejecutado por Quartz, 
    que imprime por consola la leyenda Hola Mundo -->
<bean id="holaMundo" class="com.demo.quartz.HolaMundo"/>
 
<!-- Exponemos el bean para que pueda ser accedido vioa JMX -->
<bean id="exporter" class="org.springframework.jmx.export.MBeanExporter" 
          lazy-init="false">
        <property name="beans">
            <map>
                <entry key="jobs:name=holaMundo" value-ref="holaMundo"/>
            </map> 
        </property>
</bean>
 
<!-- CONFIGURACION DE QUARTZ -->
<bean id="Tarea.HolaMundo"
  class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
        <property name="targetObject" ref="holaMundo" />
        <property name="targetMethod" value="holaMundo" />
        <property name="concurrent" value="false" />
        <!--wait until previous call completes -->
</bean>
 
<bean id="simpleTriggerActualizaciones"
      class="org.springframework.scheduling.quartz.SimpleTriggerBean">
        <property name="jobDetail" ref="Tarea.HolaMundo" />
        <property name="startDelay" value="2000" />
        <!-- reptir cada 30 segundos-->
        <property name="repeatInterval" value="30000" />
</bean>
 
<bean id="schedulerFactoryBean"
    class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
        <property name="triggers">
            <list>
                <ref bean="simpleTriggerActualizaciones" />
            </list>
        </property>
</bean>
 
 

Una vez desplegada la aplicación, ejecutamos jconsole y en la solapa MBeans estará publicado el bean.

screenshots de jconsole

Inspiración.

"Si tú tienes una manzana y yo tengo una manzana e intercambiamos las manzanas, entonces tanto tú como yo seguiremos teniendo una manzana cada uno. Pero si tú tienes una idea y yo tengo una idea, e intercambiamos las ideas, entonces ambos tendremos dos ideas"

Bernard Shaw