Java Job Scheduling: возможно ли это с Quartz, если нет, каковы мои альтернативы? - PullRequest
0 голосов
/ 04 декабря 2018

Мне нужно запланировать некоторые периодические работы, и я столкнулся с препятствием с 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 с отдельными выражениями, что я не хочу.

Я ошибаюсь, полагая, что этонетривиально с кварцем?Я также искал некоторые альтернативы, но большинство, похоже, имеет схожий синтаксис cron, и я не уверен, что они справятся и с этим.

Существует ли более точная библиотека планирования, которую я могу использовать в этом сценарии?

Ответы [ 2 ]

0 голосов
/ 05 декабря 2018

Это вполне возможно с кварцем и одним триггером.Люди часто фокусируются на триггерах Cron, но Quartz поддерживает другие типы триггеров, и они часто более подходящие.Чтобы реализовать ваш сценарий планирования, я рекомендую вам взглянуть на Quartz DailyTimeIntervalTrigger .

На снимке экрана ниже вы можете увидеть пример DailyTimeIntervalTrigger со значениями атрибутов, чтобы охватить ваш вариант использования.

DailyTimeIntervalTrigger Example

0 голосов
/ 04 декабря 2018

Я не уверен, что вы можете сделать это, как вы намекали.Кажется возможным создать собственный триггер для этого, но тогда это становится довольно трудоемким.Другой вариант - разделить двойные триггеры по дням, а не по времени.

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);
    }
}
...