Как предотвратить одновременное выполнение задания в Grails?
У меня есть кварцевая работа в grails, которая должна выполняться каждые 5 секунд, но мне нужно это последовательно. В некоторых ситуациях выполнение задания превышает это 5 секунд, в этом случае я не хочу, чтобы выполнялся, пока превизионная экспрессия еще не закончена. Как настроить это в граале?
(Конечно, вся магия может быть выполнена с помощью статического флагов, но это не очень элегантный способ сделать это)
(Также как настроить, чтобы задание было одноточечным?)
ТНХ
Ответы
Ответ 1
Предполагая, что вы используете плагин Grails Quartz, вы должны просто установить свойство concurrent
вашего класса заданий на false
.
Из документации по кварцевому плагину:
"По умолчанию задания выполняются одновременно, поэтому выполнение нового задания может начаться, даже если предыдущее выполнение того же задания все еще выполняется. Если вы хотите переопределить это поведение, вы можете использовать свойство" одновременный ", в этом случае Quartz StatefulJob будет используемый"
В более поздних версиях кварцевого плагина (версия 2.0.13 для Grails 3.3. *) Это будет выглядеть так:
class MyJob {
static concurrent = false
void execute() {
println "Job run!"
}
}
Для более старых версий grails/quartz это выглядело бы аналогично, за исключением того, что свойства были установлены с помощью def
вместо static
:
class MyJob {
static concurrent = false
void execute() {
println "Job run!"
}
}
Ответ 2
Сделайте свой класс работы реализовать StatefulJob вместо Job
Ответ 3
Для кварцевых заданий параллелизм достигается с помощью
static concurrent = false
в рабочем классе.
Обратите внимание на static
в определении, это необходимо вместо def concurrent = false
по крайней мере, начиная с версии 2.0.12. См. Кварцевую документацию.
Ответ 4
В я и я реализовал его без кварца, используя spring задачи:
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)
}
}
(размер пула 1, я думаю, даже не нужен, но, конечно, 100%;))