2013-03-21 2 views
0

예를 들어이 작업이 5 분마다 실행되고 완료하는 데 5 분 이상이 소요되는 경우 Liferay에서 작업이 예약 되었습니까?이미 실행 중일 때 작업을 실행하지 않음

내가 관찰 한 것은 직업이 다시 시작된다는 것인데, 이것이 나를 위해 문제가 될 수 있습니다.

이미 실행 중일 때 작업을 트리거하지 않는 것이 가능합니까? 이 여기에 가장 좋은 방법 일 수 있지만하지 않을 수 있습니다을 Liferay에게 6.0.6

감사

답변

2

LockLocalServiceUtil을 시도하고 그 방법 lock(), unlock()isLocked() 간다. 다음과 같은 내용이 있습니다 :

try { 
    if (LockLocalServiceUtil.isLocked()) { 
     return; 
    } 
    LockLocalServiceUtil.lock(); 

    // do your job 
} finally { 
    LockLocalServiceUtil.unlock(); 
} 

잠금은 데이터베이스에 저장되므로 클러스터 환경에는 아무런 문제가 없습니다.

+0

끝내 주셔서 감사합니다! 좀 더 자세한 정보를 제공해 주시겠습니까? LockLocalServiceUtil.lock (긴 userId, String className, 긴 키, 문자열 소유자, 부울 상속, long expirationTime) 만료 시간은 밀리 초로 측정되는 것 같습니까? 소유자 필드에는 어떤 값이 필요합니까? –

+0

예, 맞습니다 만료 시간은 밀리미터로 측정됩니다. 사실, 정확한 사용 사례를 모르지만, 나에게'lock (String className, String key, String owner, boolean retrieveFromCache)'가 항상 충분했다. 가장 간단한 방법은 _className_ 및 _key_ 매개 변수에 값 ('isLocked()'메소드 검사는이 매개 변수에 따라서 만)을 채우고 _owner_에는 일부 문자열 상수 (예 : "DEFAULT_OWNER") 및 _retrieveFromCache_를 false 값으로 채우는 것입니다. 그런 다음 unlock (String className, String key)'을 사용하여 잠금을 해제하면 모든 것이 잘 동작합니다. –

0

를 사용

*는

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; 
} 
+0

이것은 내가 생각하는 클러스터에서 작동하지 않습니다. S는 사용할 수있는 해결책이 아닙니다. 나는 당신이 solutian 이론적으로 괜찮을 것 같아 그래서 클러스터 된 내 질문에 언급하지 않았다 ... 당신의 의견을 주셔서 감사합니다! –

관련 문제