我正在使用带有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值是否有任何保证?
答案 0 :(得分:1)
您可以通过不同的方式使用 @Scheduled 注释。
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服务中的任务队列。与任务结束和下一个任务的开始有无连接,但与任务的开始和下一个任务的开始的连接