Spring Планирование: @Scheduled vs Quartz
Я читаю Spring 3.0 doc относительно планирования. Я склоняюсь к Spring JobDetailBean для кварца. Тем не менее, аннотация @Scheduled привлекла мое внимание. По-видимому, это другой способ планирования задачи с использованием Spring Framework. На основе документов Spring предусмотрено три способа планирования:
- @Scheduled
- Via Quartz
- Через таймер JDK
Я не заинтересован в таймере JDK. Почему я должен выбрать @Scheduled over Quartz? (Когда я упоминаю Кварц, я имею в виду использование Spring bean обертки для кварца).
Скажем, мой вариант использования достаточно сложный, и я буду общаться с сторонней веб-службой для импорта и экспорта данных через определенные промежутки времени.
Ответы
Ответ 1
Кварц на порядок сложнее, чем Spring встроенный планировщик, включая поддержку постоянных, транзакционных и распределенных заданий. Это немного свинья, хотя, даже с поддержкой Spring API.
Если вам нужно выполнить методы на bean каждые X секунд или по расписанию cron, тогда @Scheduled
(или различные параметры в Spring <task>
config schema), вероятно, достаточно
Ответ 2
Я должен изложить свой собственный опыт использования @Scheduled
versus Quartz
в качестве реализации планирования в приложении Spring.
Задачи расписания были следующими:
- Конечные пользователи должны иметь возможность сохранять и планировать (определять время выполнения) свои собственные задачи.
- Запланированные задания во время простоя сервера не должны опускаться из очереди заданий
Следовательно, мы должны попытаться использовать реализацию Quartz (версия 2.2.3), чтобы поддерживать сохранение заданий в базе данных. Некоторые основные выводы заключаются в следующем:
- Интеграция с приложением Spring 4 MVC совсем не сложна при использовании файла quartz.properties.
- У нас была возможность выбрать вторую базу данных для хранения заданий из основной базы данных.
- Задания, запланированные во время простоя сервера, начнут работать до тех пор, пока сервер придет.
- В качестве бонуса нам удалось сохранить в основной базе данных полезную (и более ориентированную на пользователя) информацию о пользовательских запланированных заданиях с использованием пользовательских
JobListener
и TriggerListener
.
- Quartz - очень полезная библиотека в приложениях с более сложными требованиями к планированию.
Ответ 3
Spring вы можете запланировать задачу, используя FixedRate, FixedDelay и cron. Но большая часть запланированной работы требует динамической обработки времени выполнения. Таким образом, в этом сценарии лучше использовать Quartz, так как он позволяет хранить запланированные задания в DBJobstore, а также в RAMJobstore.
Ответ 4
Согласно Кварцевой Документации
Мы можем использовать еще несколько сложных функций, которых нет в @Scheduler. например:
- в Quartz мы можем перевести планировщик в режим ожидания с помощью
scheduler.standby();
и перепланировать его с помощью scheduler.start();
, - выключение планировщика перед выполнением задания или после этого с помощью
scheduler.shutdown(true);
и scheduler.shutdown(false);
- сохранение работы для последующего использования, и, когда вам нужно, вы можете запустить ее.
JobDetail job1 =newJob(MyJobClass.class). withIdentity("job1","group1"). storeDurably(). build();
- Добавьте новое задание в планировщик, указав ему "заменить" существующее задание с указанным именем и группой (если есть).
JobDetail job1 = newJob(MyJobClass.class). withIdentity("job1", "group1"). build();