Han*_*etz 7 java cron design-patterns scheduling scheduled-tasks
我的程序有一个组件 - 称为调度程序 - 它允许其他组件及时注册他们想要回调的时间点.这应该像Unix cron服务一样工作,即你告诉调度程序"在每整个小时过去十分钟通知我".
我意识到Java中没有真正的回调.
这是我的方法,是否有一个已经完成这些工作的库?随意提出改进建议.
注册调度程序通行证:
在启动时或在新的注册请求之后,调度程序以当前系统时间的Calendar对象开始,并检查数据库中是否存在与此时间点匹配的任何条目.如果存在,则执行它们并重新开始该过程.如果没有,则Calendar对象中的时间增加一秒,并重新检查entreis.重复这一过程,直到有一个或多个匹配的条目.(离散事件模拟)
然后,调度程序将记住每秒的时间戳,睡眠和唤醒,以检查它是否已存在.如果它恰好醒来并且时间已经过去,它将重新开始,同样如果时间到了且作业已经执行.
编辑:谢谢你指点我Quartz.但是,我正在寻找更小的东西.
如果你的对象确切地知道他们希望执行的各个时间点,那么你可以使用a java.util.concurrent.ScheduledExecutorService.然后他们简单地致电:
ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(2);
long timeToExecute = ... //read from DB? use CronTrigger?
long delayToExecution = timeToExecute - System.currentTimeMillis();
scheduler.schedule(aRunnable, delayToExecution, TimeUnit.MILLISECONDS);
Run Code Online (Sandbox Code Playgroud)
你只需要使用 Quartz如果您希望调度程序本身处理"每5秒执行一次"等功能,或者您希望执行错过执行的复杂行为或执行审计跟踪的持久性,则.
实际上,您可以轻松地重复使用Quartz的CronTrigger类来获得"下一个执行时间".该类完全独立,不依赖于从Quartz"上下文"中调用.将下一个执行时间作为Date或后long,您可以使用ScheduledExecutorService上面的Java
如果您的需求很简单,请考虑使用java.util.Timer:
public class TimerDemo {
public static void main(String[] args) {
// non-daemon threads prevent termination of VM
final boolean isDaemon = false;
Timer timer = new Timer(isDaemon);
final long threeSeconds = 3 * 1000;
final long delay = 0;
timer.schedule(new HelloTask(), delay, threeSeconds);
Calendar calendar = Calendar.getInstance();
calendar.add(Calendar.MINUTE, 1);
Date oneMinuteFromNow = calendar.getTime();
timer.schedule(new KillTask(timer), oneMinuteFromNow);
}
static class HelloTask extends TimerTask {
@Override
public void run() {
System.out.println("Hello");
}
}
static class KillTask extends TimerTask {
private final Timer timer;
public KillTask(Timer timer) {
this.timer = timer;
}
@Override
public void run() {
System.out.println("Cancelling timer");
timer.cancel();
}
}
}
Run Code Online (Sandbox Code Playgroud)
正如已经指出的,java.util.concurrent的ExecutorService提供了更丰富的 API(如果您需要的话)。