Подтвердить что ты не робот

Как предотвратить одновременное выполнение задания в Grails?

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

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

ТНХ

4b9b3361

Ответ 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!"
    }
}

Ответ 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%;))