我有一份計劃在Liferay中的工作,例如,如果這項工作每5分鐘運行一次,需要超過5分鐘才能完成,那Liferay是如何處理的?當它已經在運行時不運行作業
我觀察到的是,工作將重新開始,這可能會導致我的問題。
在某種程度上,當它已經在運行時,是否可以不觸發任務?使用的Liferay 6.0.6
感謝
我有一份計劃在Liferay中的工作,例如,如果這項工作每5分鐘運行一次,需要超過5分鐘才能完成,那Liferay是如何處理的?當它已經在運行時不運行作業
我觀察到的是,工作將重新開始,這可能會導致我的問題。
在某種程度上,當它已經在運行時,是否可以不觸發任務?使用的Liferay 6.0.6
感謝
嘗試LockLocalServiceUtil
及其方法lock()
,unlock()
和isLocked()
。例如:
try {
if (LockLocalServiceUtil.isLocked()) {
return;
}
LockLocalServiceUtil.lock();
// do your job
} finally {
LockLocalServiceUtil.unlock();
}
鎖被存儲在數據庫中,所以在集羣環境中沒有問題。
這可能不是最好的做法,但在這裏
*去
private static boolean runningJob = false;
@Override
public void receive(Message arg0) throws MessageListenerException {
if(runningJob)
return;
runningJob = true; //marking that a job just started
//Do stuff { ....... } // this might take a while
runningJob = false;
}
這不會在羣集中工作我認爲:S對我來說這不是我可以使用的一種可能的解決方案。我沒有提到我的問題,它是聚集在一起,所以你solutian在理論上是好的我猜...感謝您的輸入! – 2013-03-22 13:02:41
真棒,謝謝! 您能否提供更多信息? LockLocalServiceUtil.lock(long userId,String className,long key,String owner,boolean inheritable,long expirationTime)我猜expirationTime是以毫秒爲單位測量的嗎?所有者字段中需要什麼值? – 2013-03-25 08:06:05
是的你是對的,expirationTime以milis爲單位。其實,我不知道你的確切用例,但對於我來說,一個'lock(String className,String key,String owner,boolean retrieveFromCache)'總是足夠的。如何使用它最簡單的方法是使用你的值填充_className_和_key_參數(僅僅根據這些參數調用'isLocked()'方法),並用一些String常量(比如「DEFAULT_OWNER」)和_retrieveFromCache_填充_owner_值爲false。然後你可以使用'unlock(String className,String key)'解鎖並且一切正常。 – 2013-03-25 18:23:15