【发布时间】:2011-06-23 12:14:47
【问题描述】:
我在 grails 中有一个石英作业,需要每 5 秒执行一次,但我需要按顺序执行。在某些情况下,作业的执行超过了这 5s,在这种情况下,我不想在之前的执行未完成时执行。如何在 grails 中进行配置?
(当然整个魔法都可以用一个静态的 volatile 标志来完成,但这不是一种非常优雅的方式) (另外我怎样才能将作业配置为单例?)
谢谢
【问题讨论】:
我在 grails 中有一个石英作业,需要每 5 秒执行一次,但我需要按顺序执行。在某些情况下,作业的执行超过了这 5s,在这种情况下,我不想在之前的执行未完成时执行。如何在 grails 中进行配置?
(当然整个魔法都可以用一个静态的 volatile 标志来完成,但这不是一种非常优雅的方式) (另外我怎样才能将作业配置为单例?)
谢谢
【问题讨论】:
假设您使用的是 grails 石英插件,您应该能够将作业类的 concurrent 属性设置为 false。
来自Quartz Plugin Documentation:
“默认情况下,作业以并发方式执行,因此即使之前执行的同一作业仍在运行,新作业也可以开始执行。如果您想覆盖此行为,您可以使用“并发”属性,在本例中为 Quartz 的将使用 StatefulJob”
在最新版本的石英插件(Grails 3.3.* 的 2.0.13 版)中,看起来像这样:
class MyJob {
static concurrent = false
void execute() {
println "Job run!"
}
}
对于旧版本的 grails/quartz,它看起来很相似,但属性设置为 def 而不是 static:
class MyJob {
def concurrent = false
void execute() {
println "Job run!"
}
}
【讨论】:
def concurrent = false
【讨论】:
对于基于 Quartz 的作业,并发是使用
实现的static concurrent = false
在工作类中。
请注意定义中的 static,至少从 2.0.12 版开始,需要它而不是 def concurrent = false。
请参阅Quartz documentation。
【讨论】:
我在没有石英的情况下使用 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)
}
}
(pool-size 1 我认为甚至没有必要,但要确保 100% ;))
【讨论】: