2012-11-17 2 views
0

고정 된 간격의 5 분 간격으로 2 개의 별도 독립 실행 형 Java 폴링 도구를 실행하는 시나리오가 있습니다.TaskExecutorService를 Java에서 겹쳐 쓰는 작업을 무시하는 방법

MY 시나리오는 (각 폴링 서비스)입니다 :

작업 T0 실행하는 데 5 분 이상이 필요하고 그 사이에 5 분 후에 T5가 와서 실행하려고하면

1), 내가, 그것을하지 버릴 것 대기 또는 재시작 (중복 작업 무시)

2) 다음 작업은 T10에서 정상적으로 시작됩니다.

제 질문은 쿼츠를 사용하는 것입니다. 나는 TaskExecutorService를 사용하여 어떻게 X-5가 이미 실행 중이고 한번 작업을 시작했는지 확인할 수 있습니까?

주 : 1) 나는 봄처럼 어떤 프레임 워크에서 JDK < = 6.0

2) 내가 사용하고 있지 않다을 사용해야합니다.

모든 코드 또는 방향

가 감사 ..

3)의 데스크탑 도구는 그래서 그것을 실행 필요가 실행됩니다. 아래 주석의 대답에 대한 업데이트 된

:

예는 하나의 도구에서 실행되는 작업 사이. 도구가 다르거 나 도구간에 연결이 없으면 별도로 실행되며 관계가 없습니다.

하나의 도구가 5 분 간격으로 동일한 작업을 실행합니다 (모든 파일 분과 같이 파일의 디렉토리를 찾고 발견 된 파일은 해당 파일을 분석하고 함께 작업합니다).

예를 들어 작업이 현재 1 분부터 시작되면 (예 : 시간이 걸릴 수 있음) 5 분 후에 도구가 새 파일을 다시 찾고 작업을 시작하지만 이번에는 이전 작업이 이미 일부 파일 처리를 실행하고 있으므로 새 작업이 실행되지 않고 시스템에서이를 덤프합니다 (대기열 없음/대기 없음/순차 작업 없음).

또 다른 새로운 작업은 5 배 시간에 다시 실행되며 다른 작업이 실행되고 있지 않으면 해당 파일을 구문 분석하고 처리합니다.

+0

을 하나의 도구에서 실행되는 작업간에 작업을 삭제한다고 말합니까? 왜 버려야합니까? 당신은 다른 작업을하고 있습니까? 5 분 간격으로 동일한 작업을 실행하는 경우 첫 번째 작업이 완료된 후 5 분 동안 작업이 실행되도록 보장하는 것이 좋습니다. –

답변

1

댓글의 질문에 대한 답장을 본 후 Excecutors을 사용하면 ScheduledExecutorService을 얻을 수 있습니다. 그런 다음 scheduleWithFixedDelay 메서드를 사용하여 작업을 제출할 수 있습니다. 이 메소드는 실행 사이의 지연을 사용하여 태스크를 재실행합니다. 귀하의 경우에 좋은 점은 현재 실행이 완료된 후에 지연 계산이 시작된다는 것입니다. 이것은 동시에 실행되는 두 개의 태스크가 없으므로 부울 변수 또는 ReentrantLock을 사용하지 않고 원하는 것을 제공합니다. 예외가 발생하면 이후 작업을 취소하게되므로주의해야합니다.

그래서 당신은 당신이 main 메소드에서 실행됩니다 가정

public class MyTask implements Runnable{ 

    public void run() { 
    try { 
      //your task code here 
    } catch (...) { 
     //deal with the exceptions here    
    } 
    } 

} 

실행 가능한 구현 클래스 MyTask가 있다고 가정 할 수 있습니다, 당신은 지금이 재발되는 작업 예약 클래스를 사용할 수 있습니다

public class TaskRunner{ 

private static final ScheduledExecutorService taskScheduler = Executors.newScheduledThreadPool(1); 

    public static void main(String[] args) { 
    taskScheduler.scheduleWithFixedDelay(new MyTask(),0,5,TimeUnit.MINUTES); 
    } 

} 
+0

감사합니다.이 코드를 사용하면 중복되는 작업이없고 한 번에 하나의 작업 만 실행되고 5 분 후에 새 작업이 시작됩니다. 그러나 지금 질문은 나에게왔다. 이전 5 분이 끝난 다음 5 분이 시작된다. 원래 5 분 간격이 아닙니다. 마찬가지로 첫 번째가 오전 10시에 시작하여 10시 7 분에 끝나면 다음 10시 12 분에 시작하고 10시 5 분에 10시 10 분에 시작하지 않으면 시스템이 아무 것도하지 않고 계속 진행해야합니다. 그게 가능하니? 그렇지 않으면 나는 현재의 해결책을 고수 할 것이다. – Shahriar

+0

위의 코드는 앞서 언급 한 것과 동일한 동작을합니다. 10시에 시작하여 10시 7 분에 끝나면 다음 10시 12 분에 시작합니다. 10시 12 분에 시작하는 것이 3 분 동안 실행되고 10:15에 완료되면 다음 10시 20 분에 시작됩니다. 등등. 테스트를하고 각 작업의 시작과 끝 시간을 인쇄하여 어떤 일이 일어나고 있는지 확인할 수 있습니다. –

+0

참고 : 중간에 제출 된 새 작업이 없습니다. 그것은 다시 일정 잡히는 동일한 작업입니다. 그래서 당신이 준 시나리오에서 10시 10 분에 시작하는 작업이 없습니다. 작업이 시작되고 끝나면 5 분 후에 다시 실행되도록 일정이 조정됩니다. –

0

해결책은 간단합니다. ScheduledThreadPoolExecutor.scheduleAtFixedRate (task, 5, min)를 사용합니다. 일반적인 부울 변수 isRunning=false을 선언하십시오. 각 작업은 시작시이 변수를 검사하고 이미 설정되어 있으면 종료하고 그렇지 않으면 true로 설정하여 실행합니다. 마지막에는 false로 설정합니다. 확인 및 설정은 동기화 된 블록에서 수행해야합니다.

관련 문제