2011-06-23 37 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