上文提到Zeus使用了开源的quartz来帮助其实现定时调度,但是展示给用的api有两种,一种就是quartz原生的类似cron表达式的设置,还有一种是每小时,每天这种设置,但是后台实现均是转换成quartz的api实现。
来看源码:
CronTrigger trigger = new CronTrigger(jd.getId(), "zeus",
jd.getCronExpression());
detail = new JobDetail(jd.getId(), "zeus", TimerJob.class);
detail.getJobDataMap().put("jobId", jd.getId());
detail.getJobDataMap().put("dispatcher",
context.getDispatcher());
context.getScheduler().scheduleJob(detail, trigger);
对于quartz不熟悉的同学可以 查看quartz的官网文档。
quartz中api需要一个 CronTrigger 触发器用来定时,还需要job来执行。Zeus写了一个通用的job,每个触发器都触发相同的任务,不同的是JobDetail内设置了需要触发的不同宙斯任务,以及分发任务的事件dispatcher;
public static class TimerJob implements Job {
@Override
public void execute(JobExecutionContext context)
throws JobExecutionException {
String jobId = context.getJobDetail().getJobDataMap()
.getString("jobId");
Dispatcher dispatcher = (Dispatcher) context.getJobDetail()
.getJobDataMap().get("dispatcher");
ScheduleTriggerEvent ste = new ScheduleTriggerEvent(jobId);
dispatcher.forwardEvent(ste);
}
}