es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Quartz Scheduler obtiene el valor null para getFinalFireTime aunque el cronograma haya expirado.

Estoy utilizando Quartz Scheduler en Java para programar tareas basadas en entradas en una base de datos. Estoy tratando de automatizar la desactivación de esas entradas cuando ya no se ejecuten, para no intentar leerlas cada vez que se inicia la aplicación.

Tengo un cron para una fecha muy específica, por ejemplo, 0 25 12 4 DIC ? 2021. Es una fecha específica, ya ha pasado y nunca podrá ejecutarse de nuevo.

Construyo un cron trigger y verifico endTrigger.getFinalFireTime(), que devuelve null, lo cual creo que solo debería suceder cuando el cron permite la ejecución futura.

// Construir el cron trigger final
CronTrigger endTrigger = TriggerBuilder.newTrigger()
.withIdentity(“eventEndCron”, “quartzGroup”)
.withSchedule(CronScheduleBuilder.cronSchedule(“0 25 12 4 DIC ? 2021”))
.forJob(“eventEnd”, “quartzGroup”)
.build();

Si intento programar el trabajo, lanza un error “Según la programación configurada, el desencadenador dado ‘quartzGroup.eventStartCron’ nunca se activará”.

¿Por qué getFinalFireTime no me está dando una fecha? ¿Hay algún otro enfoque que necesite utilizar?

Tags:  ,

Answer

  1. Avatar for davy.ai

    Según la documentación de Quartz Scheduler, el método getFinalFireTime devuelve la última vez en la que el disparador se activará, si tiene un número finito de ocurrencias, de lo contrario devolverá null. En su caso, dado que la expresión cron apunta a una fecha específica que ya ha pasado, el disparador tiene un número finito de ocurrencias igual a 1, por lo que getFinalFireTime debería devolver la fecha y hora pasadas.

    Sin embargo, parece que está devolviendo null en su caso. Esto podría ser debido a varias razones, como una expresión cron incorrecta, discrepancias de zona horaria u otro problema de configuración.

    Para resolver esto, puede intentar lo siguiente:

    1. Verifique nuevamente su expresión cron para asegurarse de que sea correcta y cumpla con el formato de Quartz Scheduler.

    2. Verifique la zona horaria en la que se está ejecutando Quartz Scheduler y asegúrese de que sea la misma zona horaria que la expresión cron.

    3. Intente habilitar la instrucción de fallo de Quartz Scheduler para ver si eso hace alguna diferencia. Puede configurarlo en MISFIRE_INSTRUCTION_FIRE_ONCE_NOW para forzar que el disparador se active inmediatamente si ha pasado su hora programada.

    4. Si todo lo demás falla, considere utilizar un enfoque diferente para deshabilitar las entradas que nunca se ejecutarán nuevamente. En lugar de confiar en getFinalFireTime, podría realizar un seguimiento de las fechas de los disparadores que ya se han activado y deshabilitar las entradas correspondientes en la base de datos en función de esas fechas.

Comments are closed.