Java 作业调度:这在 Quartz 中可行吗?如果不行,我的替代方案是什么?
Java Job Scheduling: Is this possible with Quartz, if not what are my alternatives?
我需要安排一些定期作业,但我在使用 Quartz 时遇到了障碍。
例如:
我认为这对于 Quartz 是不可能的(只有一个 expression/job):
- 运行 每天在 8:30 和 12:45 之间工作,时间为五分钟。例如。 8:30, 8:35, 8:40, ....12:40, 12:45.
如果它在 8:00 和 12:00 之间,那会很容易,但我找不到安排它的方法,除了处理 8:30-9:00 和 12:00-12:45 带有单独的表达式,我不想这样做。
我假设这对 Quartz 来说很重要,我错了吗?我也搜索了一些替代方案,但大多数似乎都有类似的 cron 语法,我不确定他们是否也能处理它。
是否有我可以在这种情况下使用的更细粒度的调度库?
我不确定你是否能像你暗示的那样做到这一点。似乎可以创建一个自定义触发器来执行此操作,但它会变得相当繁重。另一种选择是按天而不是时间拆分双触发器。
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);
}
}
使用 Quartz 和单个触发器完全可以做到这一点。人们通常关注 Cron 触发器,但 Quartz 支持其他触发器类型,这些通常更合适。要实现您的调度方案,我建议您查看 Quartz DailyTimeIntervalTrigger。
在下面的屏幕截图中,您可以看到一个包含属性值的 DailyTimeIntervalTrigger 示例,以涵盖您的用例。
我需要安排一些定期作业,但我在使用 Quartz 时遇到了障碍。
例如:
我认为这对于 Quartz 是不可能的(只有一个 expression/job):
- 运行 每天在 8:30 和 12:45 之间工作,时间为五分钟。例如。 8:30, 8:35, 8:40, ....12:40, 12:45.
如果它在 8:00 和 12:00 之间,那会很容易,但我找不到安排它的方法,除了处理 8:30-9:00 和 12:00-12:45 带有单独的表达式,我不想这样做。
我假设这对 Quartz 来说很重要,我错了吗?我也搜索了一些替代方案,但大多数似乎都有类似的 cron 语法,我不确定他们是否也能处理它。
是否有我可以在这种情况下使用的更细粒度的调度库?
我不确定你是否能像你暗示的那样做到这一点。似乎可以创建一个自定义触发器来执行此操作,但它会变得相当繁重。另一种选择是按天而不是时间拆分双触发器。
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);
}
}
使用 Quartz 和单个触发器完全可以做到这一点。人们通常关注 Cron 触发器,但 Quartz 支持其他触发器类型,这些通常更合适。要实现您的调度方案,我建议您查看 Quartz DailyTimeIntervalTrigger。
在下面的屏幕截图中,您可以看到一个包含属性值的 DailyTimeIntervalTrigger 示例,以涵盖您的用例。