Как предотвратить одновременное выполнение задания в Grails? - PullRequest
13 голосов
/ 23 июня 2011

У меня есть кварцевое задание в Grails, которое должно выполняться каждые 5 секунд, но мне нужно это последовательно. В некоторых ситуациях выполнение задания превышает эти 5 с, в этом случае я не хочу выполняться, пока предыдущее исключение не закончено. Как настроить это в Grails?

(Конечно, вся магия может быть сделана с помощью статического изменчивого флага, но это не очень элегантный способ сделать это) (Также, как я могу настроить одно задание на работу?)

ТНХ

Ответы [ 4 ]

24 голосов
/ 23 июня 2011

Предполагая, что вы используете плагин Grails Quartz, вы должны просто установить свойство concurrent вашего класса заданий на false.

Из документации Quartz Plugin :

"По умолчанию задания выполняются одновременно, поэтому выполнение нового задания может начаться, даже если предыдущее выполнение того же задания еще выполняется. Если вы хотите переопределить это поведение, вы можете использовать свойство« одновременный », в данном случае 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 голосов
/ 23 июня 2011

Сделайте ваш класс работы реализуйте StatefulJob вместо Job

1 голос
/ 14 мая 2019

Для параллельных заданий на основе кварца достигается использование

static concurrent = false

в классе задания.

Обратите внимание на static в определении , это необходимовместо def concurrent = false хотя бы начиная с версии 2.0.12.См. Кварцевая документация .

0 голосов
/ 24 июня 2011

На и я реализовал это без кварца, используя пружинные задачи:

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%;))

...