春季计划注解中的固定费率和固定延迟有什么区别?

2022-08-31 14:19:44

我正在使用Spring实现计划任务,我看到有两种类型的时间配置选项,从上次调用开始再次安排工作。这两种类型有什么区别?

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

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

答案 1
  • 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
     */
}

答案 2

“fixedRate”:从上一次执行开始等待 X millis,然后再开始下一次执行。如果当前执行超过“固定速率”间隔,则下一个执行将排队,这将创建一系列正在运行的任务,即将运行多个任务实例。

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 // 立即无/o 等待 1 秒,如固定速率
指定完成: 2 // 4 秒
后依此类推

“fixedDelay”:从上一次执行结束等待 X millis,然后再开始下一次执行。无论当前执行花费多少时间,下一次执行都是在将“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
完成 : 1 // 4 秒后 开始时间 : 2 // 等待 1 秒,如 fixedDelay 中指定: 2 // 4 秒后 开始时间: 3 // 1 秒
后依此类推


推荐