Esto debería ser realmente fácil. Estoy usando Quartz corriendo bajo Apache Tomcat 6.0.18, y tengo un jobs.xml file que configura mi trabajo programado que se ejecuta cada minuto.cuarzo: prevención de instancias simultáneas de un trabajo en jobs.xml
Lo que me gustaría hacer es si el trabajo todavía se está ejecutando cuando llegue el siguiente momento de activación, no quiero comenzar un nuevo trabajo, así que puedo dejar que la instancia anterior se complete.
¿Hay alguna manera de especificar esto en jobs.xml (evitar instancias concurrentes)?
Si no, ¿hay alguna manera de compartir el acceso a un singleton en memoria dentro de la implementación de Job de mi aplicación (esto es a través del JobExecutionContext?) ¿Así que puedo manejar la concurrencia por mi cuenta? (Y detectar si una instancia anterior se está ejecutando)
actualización: Después de forcejeo en torno a la documentación, aquí hay un par de enfoques que estoy considerando, pero o bien no saben cómo llegar a trabajar, o hay problemas
Use StatefulJob. Esto impide el acceso simultáneo ... pero no estoy seguro de qué otros efectos secundarios podrían ocurrir si lo uso, también quiero evitar la siguiente situación:
Supongamos que los tiempos de disparo serían cada minuto, es decir, disparador # 0 = en el tiempo 0, disparador # 1 = 60000msec, # 2 = 120000, # 3 = 180000, etc. y el gatillo # 0 en el momento 0 dispara mi trabajo que toma 130000msec. Con un trabajo simple, esto ejecutaría los disparadores # 1 y # 2 mientras el disparador de trabajo # 0 aún se está ejecutando. Con StatefulJob, esto ejecutaría los disparadores # 1 y # 2 en orden, inmediatamente después de que el # 0 termine en 130000. No quiero eso, quiero que los # 1 y # 2 no se ejecuten y el siguiente disparador que ejecuta un trabajo debería tener lugar en # 3 (180000msec). Así que todavía tengo que hacer algo más con StatefulJob para que funcione como yo quiero, así que no veo mucha ventaja en su uso.
Utilice un TriggerListener para devolver true de vetoJobExecution().
Aunque la implementación de la interfaz parece sencilla, tengo que averiguar cómo configurar una instancia de un TriggerListener de manera declarativa. Can't find the docs for the xml file.
Use un objeto
static
compartido seguro para subprocesos (por ejemplo, un semáforo o lo que sea) propiedad de mi clase que implementa el trabajo.no me gusta la idea de usar únicos a través de la palabra clave
static
bajo Tomcat/cuarzo, no estoy seguro si hay efectos secundarios. También realmente no quiero que sean verdaderos singletons, solo algo que está asociado con una definición de trabajo en particular.Implemente mi propio Trigger que extiende SimpleTrigger y contiene el estado compartido que podría ejecutar su propio TriggerListener.
De nuevo, no sé cómo configurar el archivo XML para usar este disparador en lugar del estándar
<trigger><simple>...</simple></trigger>
.
en las nuevas versiones de cuarzo, que marca el trabajo de implementación de clase con @DisallowConcurrentExecution se asegura de que sólo una clase corre en cualquier momento ... – sbrattla