我在grails中有一個石英工作,需要每5秒執行一次,但我需要按順序執行。在某些情況下,工作的執行超過了5秒,在這種情況下,我並不想在先前的執行沒有完成時執行。如何在grails中配置它?如何防止在Grails中同時執行作業?
(當然全魔可以用靜態揮發標誌位來完成,但並不是一個非常優雅的方式來做到這一點) (此外,我怎麼可以配置工作是單身?)
THX
我在grails中有一個石英工作,需要每5秒執行一次,但我需要按順序執行。在某些情況下,工作的執行超過了5秒,在這種情況下,我並不想在先前的執行沒有完成時執行。如何在grails中配置它?如何防止在Grails中同時執行作業?
(當然全魔可以用靜態揮發標誌位來完成,但並不是一個非常優雅的方式來做到這一點) (此外,我怎麼可以配置工作是單身?)
THX
假設你正在使用的Grails的石英插件,你就應該能夠把它添加到您的工作:
def concurrent = false
「默認情況下,喬布斯在並行的方式執行,因此新的作業執行可以啓動,即使同樣的工作在以前執行仍在運行。如果要覆蓋此行爲,你可以使用「併發」屬性,在這種情況下,石英的StatefulJob將用於」
在和我實現它而不石英,使用彈簧任務:
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%;))
您問了一個問題,然後選擇了一個沒有解決問題的答案。無論您最終使用什麼,這都不是解決您所問問題的最佳答案。 –
是的你是對的,雖然我寫了「他不能阻止任務不斷積累到隊列中」 - 我在腦海中想到了這種方法,事實上這是在春季調度程序中解決的。但你是對的,這是對我的問題的一個很好的答案。 – csviri
是的,這是解決方案,但我認爲這並不妨礙任務的持續積累隊列... – csviri
那麼如何防止任務隊列增長,直到OutOfMemory發生? – csviri
通常您希望任務排隊,當任務是「計數」或「分步」任務類型時,一個長任務不應阻止其他任務執行。如果這實際上是一個問題,那麼Quartz可能不是你想要的,你想要的是一個不斷在循環中運行的線程。如果你需要限制它,你可以放一個Thread.sleep(remainingTime)來延遲。 –