From a7e5866ed76310e94b675d1c675cb34a6d50ac1c Mon Sep 17 00:00:00 2001 From: Florian Langenhahn Date: Tue, 8 Jan 2019 13:54:08 +0100 Subject: [PATCH] fix race-condition in scheduler thread Fixes #29 --- .../plugins/jesque/JesqueSchedulerService.groovy | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/grails-app/services/grails/plugins/jesque/JesqueSchedulerService.groovy b/grails-app/services/grails/plugins/jesque/JesqueSchedulerService.groovy index 88bb65b..7166e28 100644 --- a/grails-app/services/grails/plugins/jesque/JesqueSchedulerService.groovy +++ b/grails-app/services/grails/plugins/jesque/JesqueSchedulerService.groovy @@ -104,10 +104,6 @@ class JesqueSchedulerService { if (!waitingJobs) return [] - //only get and wait for jobs with the exact time until something like quartz batchTimeWindow is implemented - def earliestWaitingJobTime = waitingJobs.min { it.score }.score - waitingJobs.findAll { it.score == earliestWaitingJobTime } - //lock jobs waitingJobs.inject([]) { List acquiredJobs, Tuple jobData -> String jobName = jobData.element @@ -120,6 +116,12 @@ class JesqueSchedulerService { return acquiredJobs } + if (jobData.score != trigger.nextFireTime.millis) { + log.debug "Trigger nextFireTime has been changed: job $jobName was already executed by another thread" + redis.unwatch() + return acquiredJobs + } + trigger.state = TriggerState.Acquired trigger.acquiredBy = hostName Transaction transaction = redis.multi()