Планировщик задач и использование таймера в Spring MVC на примере ScheduleTask и Quartz.

Планировщик задач и использование таймера в Spring MVC на примере ScheduleTask и Quartz.

Обзор приложения Spring MVC + AngularJS + Bootstrap + HTML5
Используемые технологии и библиотеки
  • Spring MVC 4.2.4.Release
  • Quartz Scheduler 2.2.1
  • Maven 3.2.5
  • IntelliJ IDEA 15.0.2

1. Описание задачи

Настроить приложение Spring MVC на выполнение запланированных задач по графику. Для этой цели мы будем использовать встроенную поддержку планировщика задач в Spring — Quartz Scheduler. Рассмотрим как запускать задачу по триггеру (по интервалу времени или выражению cron), а так же применение аннотаций для планирования задач.

2. Структура проекта

scheduleStructure

В проекте используются три класса для демонстрации различных видов планирования и выполнения задач: ScheduleTask — использует аннотацию @Scheduled для планирования задачи, QuartzTask и CronQuartzTask — два разных класса, которые показывают возможность выполнения задач по простому триггеру и с помощью выражения cron.

3. Зависимости в pom.xml

Относительно предыдущих глав была добавлена следующая зависимость.

Полный pom.xml:

4. web.xml, spring config

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

web.xml:

mvc-config.xml:

application-context.xml (добавленное будет описано ниже):

5. Описание Quartz, Cron

Сначала о Quartz и в чем смысл его использования. Quartz — это библиотека с открытым исходным кодом, которая может быть встроена в любое Java приложение. С помощью нее можно планировать и выполнять сотни задач. Библиотека поддерживает много фич из enterprise технологий.

Cron — демон-планировщик заданий в Unix-подобных операционных системах, использующийся для периодического выполнения заданий в определённое время. Выражения cron имеют вид ‘ * * * * * ? ‘ (minutes, hours, day of month, month, day of week, year(optional) ).

Более подробную информацию о выражения cron можно найти в интернете, для нас же будет важно понимание следующего:

* — выбирает все величины. То есть на месте позиции часа символ * означает, что задание будет выполняться каждый час;

? — незначащая величина;

, — отделяет дополнительные величины. Например, триггер “0 0 11,12 * * ?” будет срабатывать в 11 и 12 часов;

/ — определяет инкремент величины. Например, “0 0 0/2 * * ?” означает, что триггер будет срабатывать каждые 2 часа.

Сравнение Cron и Quartz
  1. Использование cron подразумевает подключение еще одной точки входа в приложение, в то время как Quartz уже встроен в него. Для Quartz появляется много возможностей внутренней коммуникации в приложении, а для cron всё сложнее. Quartz можно запустить в многопоточной среде без особых сложностей.
  2. cron зависит от платформы, Quartz — нет.
  3. Quartz позволяет гарантировать запуск задач после прошедшего времени вызова (например если сервер в нужное время лежал, то задача всё равно запуститься при восстановлении работы). В то время как чистый cron это не гарантирует (если не настроено вручную).
  4. Quartz поддерживает более гибкие выражения и настройки.
  5. Quartz позволяет работать в многопоточном режиме, что добавляет множество возможностей.
  6. Если вы используете cron из ОС, то при изменении состоянии jvm любое состояние cron может быть потеряно.
  7. С Quartz вы получаете возможность портирования (например на Win OS где cron недоступен).
  8. Возможность администрирования состояния Quartz (например на Tomcat можно смотреть что там происходит с планировщиком).

6. Описание классов и настроек

@Scheduled

Самый простой способ настройки планировщика задач — использование в классе аннотации @Scheduled.

ScheduleTask:

Класс задаем в качестве spring bean с помощью аннотации @Component. Теперь над методами используем аннотацию @Scheduled с параметрами. В данном случае в одном методе задается задержка в 10000 мс, а во втором передается cron выражение. В результате методы будут выполнятся каждые 10 и 30 секунд соответственно.

Конфигурация spring для работы аннотации @Scheduled

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

  1. Определить в пространстве имен xmlns:task=»http://www.springframework.org/schema/task» и http://www.springframework.org/schema/taskhttp://www.springframework.org/schema/task/spring-task.xsd
  2. Подключить поиск аннотаций для планирования задач  <task:annotation-driven/>
  3. Задать бин или указать пакет поиска бинов с аннотациями спринг (@Component)

Теперь при запуске приложения, каждые 10 и 30 секунд будет выводиться в консоль следующие записи (первая запись будет при запуске, т.к. в cron выражении 0\30 задана нулевая задержка после запуска приложения и вызов каждые 30 секунд):

Quartz Task

Теперь рассмотрим как планировать и выполнять задачи с помощью библиотеки Quartz Scheduler. Мы будем рассматривать два способа планирования задач: 1й по простому триггеру с временной задержкой, 2й — с помощью выражения cron аналогично примеру с аннотациями.

QuartzTask:

CronQuartzTask:

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

Чтобы выполнить эти методы нам понадобится добавить немного настроек в конфигурацию Spring. В данном случае они были добавлены в application-context.xml.

application-context.xml:

Рассмотрим что здесь написано по пунктам.

  1. Вначале задается два триггера, по которым будут запускаться задачи. В них в качестве параметров передается информация о «работе», которую нужно выполнить и свойство, которое устанавливает событие, в результате которого будет запущено выполнение задачи. В данном случае это или временная задержка или выражение cron.
  2. Описание «работы», т.е. задачи, которую необходимо выполнить. Параметрами выступают бин и метод в этом классе. В нашем случае это класс QuartzTask и метод simpleTaskMethod() в нем. Аналогично для примера с cron.
  3. Задание двух классов в качестве spring бинов (QuartzTask и CronQuartzTask).
  4. Настройка самого планировщика. В него передается список «работ» (задач) и триггеры, по которым они должны будут запускаться.

Запуск выдаст примерно следующее:

 

Исходные коды

MVC_AngularJS_Html5 full project — полный проект Spring MVC + AngularJS + Bootstrap + HTML5.

9. ScheduleTask and Quartz — код для этой части

Обзор приложения Spring MVC + AngularJS + Bootstrap + HTML5
Share Button
4
18934 Total Views 1 Views Today

One thought on “Планировщик задач и использование таймера в Spring MVC на примере ScheduleTask и Quartz.

  1. Алексей:

    недавно на конференции услышал такую мысль, что «специалисты не рекомендуют использовать многопоточность из веб-приложений»… к сожалению, не имел возможности задать вопрос выступающему, но, возможно у Вас есть идеи откуда появилось такое предубеждение?

Добавить комментарий