2011-06-23 38 views
12

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

(当然全魔可以用静态挥发标志位来完成,但并不是一个非常优雅的方式来做到这一点) (此外,我怎么可以配置工作是单身?)

THX

回答

21

假设你正在使用的Grails的石英插件,你就应该能够把它添加到您的工作:

def concurrent = false 

Quartz Plugin Documentation

“默认情况下,乔布斯在并行的方式执行,因此新的作业执行可以启动,即使同样的工作在以前执行仍在运行。如果要覆盖此行为,你可以使用“并发”属性,在这种情况下,石英的StatefulJob将用于”

+1

是的,这是解决方案,但我认为这并不妨碍任务的持续积累队列... – csviri

+1

那么如何防止任务队列增长,直到OutOfMemory发生? – csviri

+0

通常您希望任务排队,当任务是“计数”或“分步”任务类型时,一个长任务不应阻止其他任务执行。如果这实际上是一个问题,那么Quartz可能不是你想要的,你想要的是一个不断在循环中运行的线程。如果你需要限制它,你可以放一个Thread.sleep(remainingTime)来延迟。 –

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

+1

您问了一个问题,然后选择了一个没有解决问题的答案。无论您最终使用什么,这都不是解决您所问问题的最佳答案。 –

+0

是的你是对的,虽然我写了“他不能阻止任务不断积累到队列中” - 我在脑海中想到了这种方法,事实上这是在春季调度程序中解决的。但你是对的,这是对我的问题的一个很好的答案。 – csviri