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. например:

  1. в Quartz мы можем перевести планировщик в режим ожидания с помощью scheduler.standby(); и перепланировать его с помощью scheduler.start(); ,
  2. выключение планировщика перед выполнением задания или после этого с помощью scheduler.shutdown(true); и scheduler.shutdown(false);
  3. сохранение работы для последующего использования, и, когда вам нужно, вы можете запустить ее.

JobDetail job1 =newJob(MyJobClass.class). withIdentity("job1","group1"). storeDurably(). build();

  1. Добавьте новое задание в планировщик, указав ему "заменить" существующее задание с указанным именем и группой (если есть).

JobDetail job1 = newJob(MyJobClass.class). withIdentity("job1", "group1"). build();