#java #spring #scheduling
#java #весна #планирование
Вопрос:
Мне нужно настроить алгоритм планирования, который выходит за рамки возможностей встроенного планирования Spring (в основном «каждые 5 минут, но только между 4:00 и 16:00»). Кажется, что реализация org.springframework.scheduling.Интерфейс триггера — это путь, который кажется достаточно простым.
Часть, которую я не могу понять, и на которую, похоже, нет ответа в документации: как это сочетается с конфигурацией XML? Похоже, что нет никакого способа указать пользовательский компонент триггера в элементах пространства имен задач (кроме примера Quartz).
Как мне использовать пользовательский триггер в приложении Spring 3? В идеале с использованием конфигурации Bean XML.
Ответ №1:
Взгляните на DurationTrigger, который я написал год назад.
public class DurationTrigger implements Trigger {
/**
* <p> Create a trigger with the given period, start and end time that define a time window that a task will be
* scheduled within.</p>
*/
public DurationTrigger( Date startTime, Date endTime, long period ) {...}
// ...
}
Вот как вы могли бы запланировать такую задачу с помощью этого триггера:
Trigger trigger = new DurationTrigger( startTime, endTime, period );
ScheduledFuture task = taskScheduler.schedule( packageDeliveryTask, trigger );
В качестве альтернативы вы можете использовать выражение CronTrigger / cron:
<!-- Fire every minute starting at 2:00 PM and ending at 2:05 PM, every day -->
<task:scheduled-tasks>
<task:scheduled ref="simpleProcessor" method="process" cron="0 0-5 14 * * ?"/>
</task:scheduled-tasks>
Ознакомьтесь с этим JIRA, а также с этой статьей об интеграции Spring
Редактировать:
Из обсуждения JIRA вы можете настроить DurationTrigger
приведенный выше или любой другой пользовательский триггер, если на то пошло, используя Spring Integration:
<inbound-channel-adapter id="yourChannelAdapter"
channel="yourChannel">
<poller trigger="durationTrigger"/>
</inbound-channel-adapter>
<beans:bean id="durationTrigger" class="org.gitpod.scheduler.trigger.DurationTrigger">
<beans:constructor-arg value="${start.time}"/>
<beans:constructor-arg value="${end.time}"/>
<beans:constructor-arg value="${period}"/>
</beans:bean>
Довольно просто использовать интеграцию Spring в вашем проекте, даже если вы этого не планировали. Вы можете использовать как минимум вышеупомянутую часть планирования или полагаться на множество других шаблонов корпоративной интеграции, доступных Spring Integration.
Комментарии:
1. Спасибо, tolitius. Я все еще не понимаю, как запланировать повторяющуюся задачу программно (если я прав, ваш пример является единичным случаем); и у меня все еще складывается впечатление, что я не могу запланировать это через XML config (мне понадобится эквивалент атрибута @cron). Благодаря вашему сообщению я понял, что триггера cron на данный момент действительно достаточно. Я как-то забыл, что синтаксис cron допускает интервалы — ‘0 0/5 4-15 * * ?» должно хорошо работать для моего варианта использования.
2. да. И приведенное
cron expression
выше на самом деле является конфигурацией XML, которую вы ищете 🙂3. Однако выражение cron имеет ограничения. Сейчас я ни о чем не беспокоюсь, но я добавляю это в качестве комментария к вашему билету JIRA.
4. На самом деле у него нет никаких ограничений для вашего варианта использования. @Oleg-Zhurakousky привел вам пример в комментарии к JIRA.
5. Спасибо — я забыл указать на проблему, поэтому я не заметил. Я не думаю, что он прав, но давайте продолжим там.
Ответ №2:
Похоже, использование XML для настройки любого, кроме двух стандартных триггеров, невозможно в Spring 3.0. Однако он был добавлен в качестве новой функции в выпуске 3.1M2: https://jira.springsource.org/browse/SPR-8205
Спасибо Марку Фишеру за указание на это.