Java Job Scheduling:如果没有,我可以用Quartz实现吗?

时间:2018-12-04 14:53:00

标签: java scheduled-tasks quartz-scheduler scheduler job-scheduling

我需要安排一些定期工作,而我遇到了Quartz的障碍。

例如:

我认为使用Quartz(只有一个表达式/作业)是不可能的:

  • 每天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语法,而且我不确定它们是否也可以处理。

在这种情况下是否可以使用更细粒度的调度库?

2 个答案:

答案 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示例,其中包含用于覆盖用例的属性值。

DailyTimeIntervalTrigger Example