Java 作业调度:这在 Quartz 中可行吗?如果不行,我的替代方案是什么?

Java Job Scheduling: Is this possible with Quartz, if not what are my alternatives?

我需要安排一些定期作业,但我在使用 Quartz 时遇到了障碍。

例如:

我认为这对于 Quartz 是不可能的(只有一个 expression/job):

如果它在 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 示例,以涵盖您的用例。