2011-06-23 31 views
12

Tengo un trabajo de cuarzo en Grails, que debe ejecutarse cada 5 s, pero lo necesito de forma secuencial. En algunas situaciones, la ejecución del trabajo excede estos 5 segundos; en este caso, no quiero que se ejecute mientras no se termine la excepción de. ¿Cómo configurar esto en Grails?¿Cómo prevenir la ejecución concurrente de un trabajo en Grails?

(Por supuesto, toda la magia se podría hacer con un indicador volátil estática, pero no es una forma muy elegante de hacer esto) (También cómo puedo configurar I para el trabajo para ser Singleton?)

THX

Respuesta

21

Suponiendo que está usando el plugin griales de cuarzo, que sólo debe ser capaz de añadir esto a su trabajo:

def concurrent = false 

Desde el Quartz Plugin Documentation:

"Por defecto Jobs se ejecutan de forma simultánea, por lo que la nueva ejecución de trabajos puede comenzar incluso si la ejecución anterior del mismo trabajo todavía se está ejecutando. Si desea cambiar este comportamiento, puede utilizar la propiedad 'concurrente', en este caso StatefulJob de cuarzo se utiliza"

+1

Sí, esta es la solución. Sin embargo, creo que esto no impide la acumulación continua de tareas en un queue ... – csviri

+1

Entonces, ¿cómo evitar que la cola de tareas crezca hasta que OutOfMemory se ocupe? – csviri

+0

A menudo desea que las tareas hagan cola, una tarea larga no debe impedir que otras personas la ejecuten cuando la tarea es de tipo "conteo" o "paso a paso". Si esto es realmente un problema, probablemente Quartz no es lo que quieres, lo que quieres es un hilo que se ejecute constantemente en un bucle. Si necesita limitarlo, puede poner un Thread.sleep (remainingTime) para retrasarlo. –

-1

Al y yo puso en marcha sin cuarzo, utilizando tareas de primavera:

beans = { 
    xmlns task: "http://www.springframework.org/schema/task" 

    task.'scheduler'('id':"myScheduler", 'pool-size':"1") 

    task.'scheduled-tasks'('scheduler':"myScheduler") { 
     task.'scheduled'(ref:"myBean", method:"myBeanMethodToExec", 'fixed-delay':5000) 
    } 
} 

(pool-size 1 creo que incluso no es necesario, pero para estar seguro 100%;))

+1

Hiciste una pregunta y luego seleccionaste una respuesta que no abordaba la pregunta. Esta no es la mejor respuesta para responder a la pregunta que hizo, independientemente de lo que terminó usando. –

+0

Sí, tiene razón, aunque escribí "su no impide la acumulación continua de tareas en una cola" - Tenía en mente este enfoque, que de hecho está resuelto con este planificador de primavera. Pero tienes razón, esa es una buena respuesta a mi pregunta. – csviri

Cuestiones relacionadas