进度弹簧的固定速率和固定延迟有什么不同?

Ada*_*dam 36 java spring scheduled-tasks

我正在使用spring实现预定任务,我看到有2个类型的配置时间,从最近再次安排工作.2配置这个配置有什么不同.

 @Scheduled(fixedDelay = 5000)
    public void doJobDelay() {
        // do anything
    }
  @Scheduled(fixedRate = 5000)
    public void doJobRate() {
        // do anything
    }
Run Code Online (Sandbox Code Playgroud)

kuh*_*yan 33

  • 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
     */
}
Run Code Online (Sandbox Code Playgroud)

  • 在每个方法中我使用**Thread.sleep(5000)**来等待5s,但是我看不出有什么不同 (2认同)
  • 完全一样,我相信@nikhil7610 解释正确 (2认同)
  • 这个答案具有误导性,请参阅以下正确答案。 (2认同)

nik*_*610 21

"fixedRate":在开始下一次执行之前等待上一次执行开始时的X millis.如果当前执行超过'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);
}
Run Code Online (Sandbox Code Playgroud)

输出:

开始:1
完成:1 // 4秒后
开始:2 //立即按固定速率指定等待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);
}
Run Code Online (Sandbox Code Playgroud)

输出:

开始:1
完成:1 // 4秒后启动:2 //按照fixedDelay中的指定等待1秒完成:2 // 4秒后启动:3 // 1秒后依次
类推


ahm*_*tin 11

fixedRate:用于每n毫秒运行一次作业方法.这项工作是否已完成上一项任务并不重要.

fixedDelay:用于按任务之间给定的n毫秒等待时间顺序运行作业方法.

何时使用"fixedRate":如果预计不超过内存和线程池的大小,则fixedRate是合适的.如果传入的任务没有快速完成,最终可能会出现"Out of Memory exception"

何时使用"fixedDelay": 如果每个正在运行的任务彼此相关并且需要在前一个任务完成之前等待,则fixedDelay是合适的.如果小心设置fixedDelay时间,它还将让正在运行的线程有足够的时间在新任务开始之前完成其作业


小智 6

我们可以使用 Spring\xe2\x80\x99s 注释运行计划任务@Scheduled,但基于执行更改的属性fixedDelayfixedRate性质。

\n
\n

fixedDelay属性确保任务执行与下一次任务执行之间有n\n的延迟。millisecondfinish timestart time

\n
\n

当我们需要确保始终只有一个任务实例运行时,此属性特别有用。对于依赖工作来说,这是相当有帮助的。

\n
\n

该属性在每个\nfixedRate运行计划任务。它不会\xe2\x80\x99 检查该任务的任何先前执行情况。nmillisecond

\n
\n

当任务的所有执行都是独立的时,这非常有用。如果我们不期望超过内存和线程池的大小,fixedRate应该会很方便。

\n

但是,如果传入任务没有快速完成,\xe2\x80\x99s 可能会出现\xe2\x80\x9c内存不足异常\xe2\x80\x9d。

\n


小智 5

固定延迟:专门控制上次执行完成后下次执行的时间。

固定速率:使 Spring 定期运行任务,即使最后一次调用可能仍在运行。

  • 这对于固定利率来说是不正确的,它会等待 (2认同)

小智 5

应该澄清的一件事是,fixedRate这并不意味着执行将以一定的时间间隔开始。

如果一个执行成本太多时间(比固定利率多),接下来的执行才会开始的前一个结束,除非@Async@EnableAsync提供。作为 SpringThreadPoolTaskScheduler实现的一部分的以下源代码解释了原因:

@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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

可以看到,只有在上一个任务完成后(super.run()),才会安排下一个任务(schedule())。随着@Async@EnableAsyncsuper.run()是一个异步函数,它会立即返回,因此,接下来的任务不必等待前一时间的实际完成。