2010-10-09 7 views
8

Tengo un trabajo programado que tiene un intervalo de repetición por cada 5 minutos. Está funcionando bien.¿Cómo hacer que el proceso Quartz.NET sea sincronizado?

Pero tengo una situación en la que mi primer trabajo no se completa en 5 minutos y está comenzando un segundo trabajo (como estaba programado para 5 minutos).

No quiero hacer eso, solo un trabajo debería estar funcionando a la vez. ¿Cómo puedo hacer eso?

Este es mi código:

ISchedulerFactory schedFact = new StdSchedulerFactory(); 
IScheduler sched = schedFact.GetScheduler(); 
Trigger emailTrigger = TriggerUtils.MakeMinutelyTrigger(5); 
emailTrigger.StartTimeUtc = TriggerUtils.GetEvenMinuteDate(DateTime.UtcNow); 
emailTrigger.Name = "EmailTrigger"; 
JobDetail emailJobDetail = new JobDetail("EmailJob", null, typeof(EmailJob)); 
sched.ScheduleJob(emailJobDetail, emailTrigger); 
sched.Start(); 

Respuesta

1

He usado Quartz.net un poco, pero nunca se investigó la aplicación de procesamiento en serie entre puestos de trabajo. Desde mi experiencia, Quartz está más destinado al procesamiento programado "paralelo", donde los trabajos pueden superponerse si se ejecutan durante mucho tiempo, por lo que no estoy seguro de si es compatible con lo que necesita.

Una solución simple a su problema podría ser utilizar una variable de sincronización a la que se pueda acceder mediante cualquiera de los subprocesos de trabajo (por ejemplo, un candado, mutex, semáforo o booleano global, etc.). Cuando se inicia un nuevo trabajo, debe verificar el bloqueo y, si es gratis, agarrarlo y mantenerlo hasta que haya terminado. Si se despierta otro trabajo y ve que un trabajo anterior aún se está ejecutando, el nuevo trabajo puede simplemente salir y esperar a que el planificador intente nuevamente en el siguiente intervalo. También podría hacer que el nuevo trabajo espere a que lo anterior termine, pero si lo hace, corre el riesgo de que los trabajos se acumulen esperando a ejecutarse, y el sistema nunca "alcance".

+0

Ni siquiera tiene que esperar; puede probar y agarrar el mecanismo de sincronización. Si falla, entonces el trabajo debe regresar para que esté completo y listo. Si lo agarra, entonces debe procesarlo. No hay "alcance". Por supuesto, el hecho de que omitió debe registrarse y uno debe volver a evaluar su programación en ese momento. – casperOne

30

Quartz.NET 2.x

Implementar IJob y también la decoración de su clase de trabajo con [DisallowConcurrentExecution] atributo. Lea la documentación de la API para DisallowConcurrentExecutionAttribute para obtener más información.

Quartz.NET 1.x

hacer la clase de trabajo a implementar IStatefulJob en lugar de IJob. Lea la documentación de la API para IStatefulJob para obtener más información.

http://www.quartz-scheduler.net/documentation/faq.html#howtopreventconcurrentfire

+7

O en Quartz.net 2.0, implemente IJob y decore con el atributo 'DisallowConcurrentExecution' – Cocowalla

+0

Gracias, he actualizado la respuesta –

+0

@Neo, actualice la respuesta correcta. – regisbsb

Cuestiones relacionadas