我有一个Web应用程序,每小时与中央数据库同步四次。这个过程通常需要2分钟。我想将此过程作为X:55,X:10,X:25和X:40的线程运行,以便用户知道在X:00,X:15,X:30和X:45他们有一个干净的数据库副本。这只是关于管理期望。我已经通过java.util.concurrent
中的执行程序,但调度是使用scheduleAtFixedRate
完成的,我相信这并不保证何时实际按小时运行。我可以使用第一次延迟来启动Runnable
,以便第一次延迟接近发射时间和每15分钟的时间表,但似乎这可能会在时间上发生分歧。是否有更简单的方法来安排线程在每个季度之前5分钟运行?
答案 0 :(得分:9)
您可以让Runnable安排“下次运行”。
,例如,
class Task implements Runnable {
private final ScheduledExecutorService service;
public Task(ScheduledExecutorService service){
this.service = service;
}
public void run(){
try{
//do stuff
}finally{
//Prevent this task from stalling due to RuntimeExceptions.
long untilNextInvocation = //calculate how many ms to next launch
service.schedule(new Task(service),untilNextInvocation,TimeUnit.MILLISECONDS);
}
}
}
答案 1 :(得分:2)
Quartz非常合适,因为您的应用程序是基于网络的。它将提供您需要的细粒度时间安排。
Quartz是一个功能齐全的开源软件 可以的工作调度服务 与侧面集成或一起使用 几乎任何Java EE或Java SE 应用 - 从最小的 独立应用程序最大的 电子商务系统。可以使用石英 创建简单或复杂的计划 执行数十,数百甚至甚至 成千上万的工作;工作的 任务被定义为标准Java 可以虚拟执行的组件 你可以编程要做的任何事情。 Quartz Scheduler包含许多 企业级功能,例如JTA 交易和集群。
答案 2 :(得分:1)