我有grails的石英作业,需要每5秒执行一次,但我需要按顺序执行。在某些情况下,作业的执行超过了这个5秒,在这种情况下,我不想在前一个执行没有完成时执行。如何在grails中配置?
(当然整个魔法可以使用静态易失性标志来完成,但这不是一种非常优雅的方式) (另外,我如何配置作业是单身?)
THX
答案 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%;))