Java Quartz-планировщик между временем - PullRequest
0 голосов
/ 10 октября 2018

У меня есть работа, которую я хочу начать использовать кварцевый планировщик (v2.1.5) в определенное время каждый день (например, с 8 утра до 10 утра с интервалом 5 минут) без использования выражения cron, только нативные методы.(по нативным методам, которые я понимаю, реализованные в этой кварцевой библиотеке).У меня есть триггер:

TriggerBuilder builder = TriggerBuilder.newTrigger()
                .withIdentity(name, group)
                .withSchedule(SimpleScheduleBuilder.simpleSchedule()
                        .withIntervalInMilliseconds(interval)
                        .repeatForever());

Конечно, выражение cron не делает ничего сложного, и я могу использовать его вместо этого.Но в любом случае я бы просто знал, возможно ли использование нативных методов в этой проблеме.Рад любым советам!

Ответы [ 2 ]

0 голосов
/ 10 октября 2018

Методы API охватывают несколько простых (каждый X, в X) и не очень простых (дни A, B, C в X, ежемесячно в X) сценариев, но ваш немного превосходит это.
Выможно попробовать выполнить эту задачу, чтобы запланировать выполнение задания каждые 5 минут, с 8:00 до 10:00:

Trigger trigger = TriggerBuilder.newTrigger() // identity, job, etc.
        .withSchedule(simpleSchedule()
                .withIntervalInMinutes(5)
                .repeatForever())
        .startAt(DateBuilder.tomorrowAt(8,0,0))
        .endAt(DateBuilder.tomorrowAt(10,0,0))
        .build();

, а затем включить некоторую логику в свою работу, чтобы перенастроить себя на следующий день таким же образом, по окончании.
В качестве альтернативы, вы можете просто запланировать его запуск каждые 5 минут навсегда, и проверить работу, если это между 8:00 и 10:00, прежде чем делать что-либо.

Или вы могли бы использовать, вы знаете ... cronвыражение:

Trigger trigger = TriggerBuilder.newTrigger() // identity, job, etc.
        .withSchedule(cronSchedule("0 0/5 8-10 * * ? *"))
        .startAt(DateBuilder.evenMinuteDateAfterNow())
        .build();

Что делает именно то, что вы хотите - для этого нужны выражения cron.

0 голосов
/ 10 октября 2018

Вот пример из учебника Quartz (немного изменен):

var cal = new DailyCalendar(8, 0, 0, 0, 10, 0, 0, 0); // range start and end hours, minutes, seconds and millis
cal.setInvertTimerange(true); // by default the date interval specified above is excluded from execution. 
// This turns it around and only allows execution within the interval

var t2 = TriggerBuilder.newTrigger()
    .withIdentity("myTrigger2")
    .forJob("myJob2")
    .withSchedule(SimpleScheduleBuilder.simpleSchedule()
                    .withIntervalInMilliseconds(interval)
                    .repeatForever());
    .modifiedByCalendar(cal)
    .build();

Хитрость заключается в том, чтобы иметь простой триггер (как вы показали выше), но затем иметьреализация календаря, которая может указывать время, когда разрешено выполнение этого триггера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...