Spring @Scheduled计时器准确度

时间:2017-06-03 19:43:45

标签: java spring spring-boot spring-scheduled

我正在使用带有fixedDelay的spring-boot @Scheduled注释(以毫秒为单位),如javadoc中所述:

  

在最后一次调用结束和下一次调用开始之间以固定周期(以毫秒为单位)执行带注释的方法。

代码:

@Scheduled(fixedDelay=1000)
public void task() {
    LOG.info("START: " + System.currentTimeInMillis());
    ....do some work here...
    LOG.info("END: " + System.currentTimeInMillis());
}

有时我会得到这样的输出,即前一个任务结束和下一个任务开始之间的时间小于约1000ms的{​​{1}}。

由于某些粒度是正常还是为什么会发生?这个delta值是否有任何保证?

3 个答案:

答案 0 :(得分:1)

您可以通过不同的方式使用 @Scheduled 注释。

根据documentation

fixedRate 每t ms调用一次方法,但是从调用开始就测量时间延迟。如果传递了t ms并且该方法仍在执行中,则下一次调用将等待它完成,并将在第一次调用之后立即调用。尝试将Thread.sleep(3000)放入您的方法中。我认为您的方法需要大约950毫秒才能完成。

如果您想在完成执行后等待,可以使用 fixedDelay

答案 1 :(得分:0)

显然,由于您很可能不在实时系统上,因此无法保证。根据CPU目前的工作情况,它可能会发生变化。由于操作系统调度等等,在大多数PC上执行类似的操作非常困难(除非您可以直接访问CPU / GPU,但即便如此)

答案 2 :(得分:0)

private async void Page_Appearing(object sender, EventArgs e) { //...call async code here var handler = await DataHandler.CreateDataHandler("<path here>"); //..do what you need to do with the handler. //unsubscribing from the event this.Appearing -= Page_Appearing; } 如何工作,它将每@Scheduled(fixedDelay=1000)运行此void方法(如果此任务完成执行1000 ms <或此操作将异步运行)。如果1000 ms >,则执行任务将进入所使用的Executor服务中的任务队列。与任务结束和下一个任务的开始连接,但与任务的开始和下一个任务的开始的连接