Главная » Spring » Выполнение заданий по расписанию и в фоновом режиме Spring

0

Наиболее заметными функциональными особенностями боль- шинства приложений являются те, что реагируют на действия пользователя. Пользователь заполняет форму, щелкает на кнопке, и приложение реагирует, обрабатывая информацию, сохраняя ее в базе данных и производя некоторый вывод.

Но иногда приложения выполняют свою собственную работу, без участия пользователя. В то время как пользователь щелкает на кнопки, приложение может выполнять фоновые задания, не требую- щие участия пользователя.

Фреймворк Spring поддерживает две разновидности фоновых за- даний:

#  выполнение заданий по расписанию;

#  асинхронные методы.

Задания, выполняемые по расписанию, включают операции, кото- рые требуется выполнять регулярно, через определенные интервалы времени или в определенное время суток. Асинхронные методы, на- против, вызываются приложением, но они немедленно возвращают управление вызывающей программе, продолжая выполнение в фо- новом режиме.

Независимо от выбранного типа заданий для их поддержки не- обходимо включить всего одну строку в конфигурационный файл контекста приложения Spring:

<task:annotation-driven/>

Элемент <task:annotation-driven/> включает  в Spring  автоматиче- скую поддержку заданий, выполняемых по расписанию, и асинхрон- ных методов. Эти методы идентифицируются с помощью аннотаций

@Scheduled и @Async соответственно.

Посмотрим, как пользоваться этими аннотациями, начав с анно- тации @Scheduled, применяемой для организации вызова методов по расписанию.

Объявление методов, вызываемых по  расписанию

Имеющие опыт работы с фреймворком Spring знают, что он под- держивает возможность вызова методов по расписанию. Но до не- давнего времени для этого требовалось включать дополнительные настройки в конфигурационный файл Spring. Во втором издании этой книги я на 10 страницах описывал, как реализовать вызовы методов по расписанию.

С появлением новой аннотации @Scheduled в Spring 3 все изме- нилось. Если раньше для достижения цели требовалось несколько строк в XML-файле и некоторое количество компонентов, то теперь достаточно одного элемента <task :annotation-driven> и единственной аннотации. И для описания их использования мне потребуется явно меньше 10 страниц.

Чтобы превратить метод в задание, выполняемое по расписанию, его необходимо отметить аннотацией @Scheduled. Например, чтобы

обеспечить автоматический вызов метода через каждые 24 часа (86 400 000 миллисекунд):

@Scheduled(fixedRate=86400000) public   void   archiveOldSpittles()   {

// …

}

Атрибут fixedRate определяет периодичность вызова метода в миллисекундах. В данном случае указано, что вызовы должны осу- ществляться через каждые 86 400 000 миллисекунд. Определить ин- тервал времени, который должен пройти между моментом заверше- ния метода и моментом следующего его вызова, можно с помощью атрибута fixedDelay:

@Scheduled(fixedDelay=86400000) public   void   archiveOldSpittles()   {

// …

}

Выполнение заданий через определенные интервалы времени – довольно удобная возможность. Но иногда может потребоваться возможность более точного управления временем вызова метода. Атрибуты fixedRate и fixedDelay позволяют управлять только перио- дичностью вызова метода, но не моментом, когда это произойдет. Определить точные моменты вызова метода можно с помощью атри- бута cron:

@Scheduled(cron="0 0 0 * * SAT") public    void    archiveOldSpittles()    {

// …

}

Значение в атрибуте cron указывается в формате планировщика Cron. Для тех, кто не знаком с планировщиком Cron, разберем, как определяется значение в атрибуте cron. Это значение состоит из шес- ти элементов (возможно, из семи), разделенных пробелами. В по- рядке следования слева направо эти элементы имеют следующие значения:

1.   Секунды (0–59).

2.   Минуты (0–59).

3. Часы (0–23).

4.   День месяца (1–31).

5.   Месяц (1–12 или JAN–DEC).

6.   День недели (1–7 или SUN–SAT).

7. Год (1970–2099).

Каждый из этих элементов может определяться как конкретное значение (6), как диапазон (9–12), как список (9, 11, 13) или как шаблонный символ (например, *). День месяца и день недели явля- ются взаимоисключающими, поэтому необходимо явно определить, какой из них не будет использоваться, указав в ненужном элементе знак вопроса (?). В табл. 17.1 приводится список некоторых выра- жений в стиле планировщика Cron, которые можно использовать в атрибуте cron.

В примере выше указано, что архивирование старых сообщений должно выполняться каждую субботу в полночь. Но благодаря ис- пользованию выражений в стиле планировщика Cron богатство воз- можных вариантов практически не ограничено. Атрибуты fixedRate и fixedDelay ограничивают наши возможности фиксированными пе- риодами времени, тогда как атрибут cron позволяет запланировать вызов метода в любые моменты времени. Я уверен, что вы сможете придумать массу интересных выражений в стиле Cron для опреде- ления расписаний вызовов своих методов.

Таблица 17.1. Некоторые примеры выражений в стиле планировщика Cron

Выражение Cron

Описание

0  0  10,14,16  *  *  ?

Ежедневно, в 10:00, 14:00 и в 16:00

0 0,15,30,45 * 1-30 * ?

Каждые 15 минут с 1 по 30 число месяца

30  0  0  1  1  ?  2012

Через 30 секунд после полуночи 1 января 2012 года

0 0 8-17 ? * MON-FRI

Каждый час в течение рабочего дня с понедельника по пятницу

Источник:   Уоллс К., Spring в действии. – М.: ДМК Пресс, 2013. – 752 с.: ил.

По теме:

  • Комментарии