java 자바 - 스케줄 스프링의 고정 속도와 고정 지연 사이의 차이점은 무엇입니까?





패널 새로 (5)


고정 지연 : 특히 마지막 실행이 완료 될 때 다음 실행 시간을 제어합니다.

Fixed Rate : 마지막 호출이 여전히 실행 중일지라도 주기적으로 Spring이 작업을 실행하도록합니다.

나는 봄을 사용하여 예정된 작업을 구현하고 있으며 2 가지 유형의 설정 시간이 예정된 시간부터 다시 작동한다는 것을 알고 있습니다. 이 두 가지 유형의 차이점은 무엇입니까?

 @Scheduled(fixedDelay = 5000)
    public void doJobDelay() {
        // do anything
    }
  @Scheduled(fixedRate = 5000)
    public void doJobRate() {
        // do anything
    }



  • fixedRate : 마지막 호출이 여전히 실행 중일지라도주기적인 간격으로 Spring이 작업을 실행하게합니다.
  • fixedDelay : 마지막 실행이 끝날 때 다음 실행 시간을 구체적으로 제어합니다.

코드에서 :

@Scheduled(fixedDelay=5000)
public void updateEmployeeInventory(){
    System.out.println("employee inventory will be updated once only the last updated finished ");
    /**
     * add your scheduled job logic here
     */
}


@Scheduled(fixedRate=5000)
public void updateEmployeeInventory(){
    System.out.println("employee inventory will be updated every 5 seconds from prior updated has stared, regardless it is finished or not");
    /**
     * add your scheduled job logic here
     */
}



명확히해야 할 한 가지는 fixedRate 가 실행이 특정 시간 간격으로 시작된다는 것을 의미하지 않는다는 것입니다.

하나의 실행에 너무 많은 시간 (고정 속도 이상)이 소요되면 @Async@EnableAsync 가 제공되지 않는 한 다음 실행이 끝난 후에 만 실행됩니다. Spring의 ThreadPoolTaskScheduler 구현의 일부인 다음 소스 코드는 이유를 설명합니다.

@Override
public void run() {
    Date actualExecutionTime = new Date();
    super.run();
    Date completionTime = new Date();
    synchronized (this.triggerContextMonitor) {
        this.triggerContext.update(this.scheduledExecutionTime, actualExecutionTime, completionTime);
        if (!this.currentFuture.isCancelled()) {
            schedule();
        }
    }
}

이전 태스크가 완료된 후에 만 ​​( super.run() ), 다음 태스크가 스케줄됩니다 ( schedule() ). @Async@EnableAsync 사용하면 super.run() 이 즉시 반환되는 비동기 함수이므로 다음 작업이 이전 작업이 실제로 완료 될 때까지 기다릴 필요가 없습니다.




"fixedRate": 다음 실행을 시작하기 전에 이전 실행 시작으로부터 X 밀리를 기다립니다. 현재 실행이 'fixedRate'간격을 초과하면 다음 실행은 대기되지만 다음 실행 만 대기합니다. 그것은 일련의 대기중인 실행을 생성하지 않습니다.

private static int i = 0;

@Scheduled(initialDelay=1000, fixedRate=1000)
public void testScheduling() throws InterruptedException {
    System.out.println("Started : "+ ++i);
    Thread.sleep(4000);
    System.out.println("Finished : "+ i);
}

산출:

시작 : 1
완료 : 1 초 / 4 초 후
시작 : 2 // 고정 속도로 지정된대로 1 초 동안 대기하지 않고 즉시 //
완료 : 2 초 후 / 4 초 후
등등

"fixedDelay": 다음 실행을 시작하기 전에 이전 실행의 끝에서 X 밀리를 기다립니다. 현재 실행이 얼마나 걸리는지 상관 없지만 현재 실행의 종료 시간에 'fixedDelay'간격을 추가 한 후 다음 실행이 시작됩니다. 다음 실행을 대기열에 넣지 않습니다.

private static int i = 0;

@Scheduled(initialDelay=1000, fixedDelay=1000)
public void testScheduling() throws InterruptedException {
    System.out.println("Started : "+ ++i);
    Thread.sleep(4000);
    System.out.println("Finished : "+ i);
}

산출:

시작 : 1
Finished : 1 // 4 초 후 시작 : 2 // fixedDelay에 지정된대로 1 초 대기 완료 : 2 // 4 초 후 시작 : 3 // 1 초 후
등등




1. HashmapHashTable 모두 키와 값을 저장합니다.

2. Hashmap 은 하나의 키를 null 로 저장할 수 있습니다. Hashtablenull 저장할 수 없습니다.

3. HashMap 은 동기화되지 않지만 Hashtable 은 동기화됩니다.

4. HashMapCollection.SyncronizedMap(map) 과 동기화 될 수 있습니다.

Map hashmap = new HashMap();

Map map = Collections.SyncronizedMap(hashmap);






java spring scheduled-tasks