我有一项定期安排的任务。有时可能需要比预期更长的时间。 我试图找到一种方法来确保在任务已经运行的情况下取消调度。我检查的所有机制都会使任务等待并在第一次完成后运行它
锁定课程将完成工作,但我正在寻找更高水平的东西任何想法
答案 0 :(得分:3)
您可以使用ScheduledExecutorService
。 scheduleAtFixedRate
可能是你想要的,因为它等待你的任务完成,如果你需要比你指定的 rate 更长的时间:
如果执行此任务的时间超过其周期,则后续执行可能会延迟,但不会同时执行。
示例:
ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor();
scheduler.scheduleAtFixedRate(() -> {
// Body will be executed every second unless the previous task hasn't finished.
}, 0L, 1L, TimeUnit.SECONDS);
答案 1 :(得分:1)
有一种叫做scheduleAtFixedRate和scheduleAtFixedDelay的东西。
scheduleAtFixedRate将在定义的时间启动另一个进程,因此如果前一个进程没有完成,将运行两个进程,这可能会导致两次运行相同的竞争条件。scheduleAtFixedDelay将在任务完成后的固定时间后启动。
scheduleAtFixedRate vs scheduleWithFixedDelay
在Spring中,您可以使用注释来执行此操作: -
@Scheduled(fixedDelay =30000)
http://howtodoinjava.com/spring/spring-core/4-ways-to-schedule-tasks-in-spring-3-scheduled-example/
答案 2 :(得分:0)
尝试阅读此页面: http://camel.apache.org/quartz2.html