我需要安排一些定期工作,而我遇到了Quartz的障碍。
例如:
我认为使用Quartz(只有一个表达式/作业)是不可能的:
如果它是在8:00和12:00之间,那很容易,但是我找不到安排它的方法,只能用单独的表达式处理8:30-9:00和12:00-12:45,我不想。
我是否认为这与Quartz无关紧要?我还搜索了一些替代方法,但是大多数替代方法似乎都具有类似的cron语法,而且我不确定它们是否也可以处理。
在这种情况下是否可以使用更细粒度的调度库?
答案 0 :(得分:1)
正如您所暗示的,我不确定您可以执行此操作。似乎可以创建一个自定义触发器来执行此操作,但是随后就需要进行大量工作。另一种选择是按天而不是时间划分双重触发器。
public class TestQuartz {
class ActualJob implements Job {
@Override
public void execute(JobExecutionContext context)
throws JobExecutionException {
}
}
class DailyJob implements Job {
@Override
public void execute(JobExecutionContext context)
throws JobExecutionException {
// Run from now (8:45) every 5 minutes until 12:45 (endDate)
Trigger trigger =
newTrigger()
.startNow()
.endAt(endDate) // 12:45 PM TODAY
.withSchedule(
cronSchedule("0 0/5 * 1/1 * ? *"))
.build();
try {
Scheduler sched = context.getScheduler();
sched.scheduleJob(newJob(ActualJob.class).build(), trigger);
} catch (SchedulerException ex) {
throw new JobExecutionException(ex);
}
}
}
@Test
public void testQuartz() throws SchedulerException {
SchedulerFactory sf = new StdSchedulerFactory();
Scheduler sched = sf.getScheduler();
// Run once a day starting at 8:45 AM
Trigger dailyTrigger =
newTrigger().withSchedule(cronSchedule("0 45 8 1/1 * ? *")).build();
JobDetail job = newJob(DailyJob.class).build();
sched.scheduleJob(job, dailyTrigger);
}
}
答案 1 :(得分:1)
使用Quartz和单个触发器完全可以做到这一点。人们通常将重点放在Cron触发器上,但是Quartz支持其他触发器类型,它们通常更适合。为了实现您的调度方案,建议您查看Quartz DailyTimeIntervalTrigger。
在下面的屏幕截图中,您可以看到一个DailyTimeIntervalTrigger示例,其中包含用于覆盖用例的属性值。