Как мне настроить пользовательский триггер в Spring 3?

#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

Спасибо Марку Фишеру за указание на это.