如何防止在Grails中并发执行作业?

时间:2011-06-23 12:14:48

标签: grails quartz-scheduler

我有grails的石英作业,需要每5秒执行一次,但我需要按顺序执行。在某些情况下,作业的执行超过了这个5秒,在这种情况下,我不想在前一个执行没有完成时执行。如何在grails中配置?

(当然整个魔法可以使用静态易失性标志来完成,但这不是一种非常优雅的方式) (另外,我如何配置作业是单身?)

THX

4 个答案:

答案 0 :(得分:24)

假设您使用的是grails quartz插件,您应该只能将作业类的concurrent属性设置为false

来自Quartz Plugin Documentation

  

“默认情况下,作业以并发方式执行,因此即使先前执行同一作业仍在运行,也可以启动新作业执行。如果要覆盖此行为,可以使用'并发'属性,在本例中为Quartz's StatefulJob将被用于“

在更新版本的quartz插件(Grails 3.3。*版本2.0.13)中,如下所示:

class MyJob {

    static concurrent = false

    void execute() {
        println "Job run!"
    }
}

对于旧版本的grails / quartz,它看起来很相似,但使用def而不是static设置属性是个例外:

class MyJob {

    static concurrent = false

    void execute() {
        println "Job run!"
    }
}

答案 1 :(得分:2)

答案 2 :(得分:1)

对于基于Quartz的作业,并发是使用

static concurrent = false

在工作类别中。

请注意定义中的static ,至少从2.0.12版本开始,需要使用它代替def concurrent = false。 参见Quartz documentation

答案 3 :(得分:-1)

在和我实施它没有石英,使用弹簧任务:

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