2016-09-11 2 views
-1

작업을 실행하기 위해 Spring Task Scheduler를 처음 사용하므로 기본적인 질문 일 수 있습니다. Runnable을 구현하는 클래스 내에서 처리하고자하는 항목 목록이 있습니다. 여기 내 작업 클래스입니다 :Spring Task Scheduler 연속 작업

public class ProcessTask<T> implements Runnable { 

private String item; 

public ProcessTask(String item) { 
    System.out.println("Starting process for " + item); 
    this.item = item; 
} 

@Override 
public void run() { 
    System.out.println("Finishing task for " + item); 
} 
내가 항목의 목록을 처리하려는

, 이전 작업 후 10 초부터 각각 시작했다. 이전 작업이 예약 된 후 각 작업을 10 초 실행하도록 설정할 수 있음을 이해합니다. 그러나 다른 프로세스가 작업을 10 초가 경과하기 전에 실행할 수 있으므로이 작업에 의존하고 싶지 않습니다. 십초 오프

 Date end = new Date(cal.getTimeInMillis() + 10000); // this is the time that the task should be fired off, the first one being 10 seconds after the current time 

    for(String item : items) { 
     Calendar cal = Calendar.getInstance(); 
     cal.setTime(end); 
     System.out.println("Next task fires at " + cal.getTime()); 
     ProcessTask task = new ProcessTask(item); 
     ScheduledFuture<?> future = taskScheduler.schedule(task, end); 

     end = new Date(Calendar.getInstance().getTimeInMillis() + 10000); 
    } 

첫 번째 작업의 화재 코드가 큰 인 실행 후 :

그래서 내 메인 클래스에서, 나는 다음 있습니다. 그러나 나머지 항목은 10 초를 기다리지 않고 즉시 예약됩니다. 나는 왜 그런 일이 일어나는 지 이해한다. 왜냐하면 taskScheduler.schedule은 비동기 적이기 때문에 for 루프는 계속 진행되고 나머지 아이템은 10 초 후에 스케줄링된다.

내가 같은 초 동안 메인 쓰레드의 수면을 갖고, ScheduledFuture 다음 작업을 예약하기 전에 완료되었는지 확인하려고 :

while(!future.isDone()) { 
    Thread.sleep(1000); 
    System.out.println("is future done: " + future.isDone()); 
} 

내가 바로 위의 블록 ScheduledFuture<?> future = taskScheduler.schedule(task, end); 후이 블록을 추가하는 경우, future.isDone()은 항상 false를 반환하고 ProcessTaskrun() 메서드는 호출되지 않습니다.

ScheduledFuture을 사용하여 이전 작업이 종료되었는지 판단 할 수있는 방법이 있습니까? 그렇지만 이전 작업이 종료 되었으면 계속 기다리시겠습니까? 이 작업을 수행하는 전반적인 더 좋은 방법이 있습니까? 미리 감사드립니다.

+0

그래서 특정 시간부터 시작하고 다른 사람들이 10 초 후에 시작할 수 있도록 하시겠습니까? 그런 다음 달력을 사용하지 않으려면 할당을 '끝'으로 변경하고 이전 끝 값은 변경 하시겠습니까? –

+0

@KoosGadellaa 이전 작업이 실행 된 후 각 작업이 10 초 후에 시작되도록하는 방법을 찾고 있습니다. 앞으로는 작업을 10 초 이상 완료 할 수 있도록 확장 할 예정입니다. 이런 일이 발생하면 이전에 완료 한 시점 이후 10 초 동안 다음 일정을 예약하려고하므로 예약 된 시간에 의존하고 싶지는 않지만 대신 실제로 실행 한 시간입니다. 다행히도 그것은 의미가 있습니다. – user172092

+0

이 지점을 상세히 설명하는 게시물을 편집했습니다. – user172092

답변

1

작업이 끝나는 시점을 알 수 없지만 10 초 후에 다음 작업을 실행하려고합니다. 그래서 그 일이 끝나면 계획을 세울 수 있습니다. 그래서 배관을하는 기본 추상 클래스를 가져야합니다.

public abstract class ScheduleTaskAfterRun<T> implements Runnable { 
    protected void executeContent(); 
    private Runnable nextTask; 
    private taskScheduler; // init somehow, probably by constructor... 

    public void setNextTask(Runnable r) { 
     nextTask = r; 
    } 

    @Override 
    public void run() { 
     executeContent(); 
     scheduleNextTask(); 
    } 

    private void scheduleNextTask() { 
     if(nextTask == null) { 
      System.out.println("No task to handle, finished!"); 
      return; 
     } 
     Date end = new Date(Calendar.getInstance().getTimeInMillis() + 10000); 
     ScheduledFuture<?> future = taskScheduler.schedule(nextTask, end); 
    } 
}