Quartz job Vs. Thread для немедленной однократной задачи


Предположим, у меня есть какая-то единица работы, которую нужно выполнить, и я хочу сделать это асинхронно относительно остальной части моего приложения, потому что это может занять много времени, например, от 10 секунд до 2 минут. Для этого я рассматриваю два варианта:

  1. запланируйте кварцевую работу с простым триггером, настроенным на срабатывание только один раз и как можно скорее.
  2. Создайте управляемый экземпляр, передайте его потоку и вызовите run();.

В контексте вышесказанного у меня есть следующие вопросы:

  1. Что дает мне работа с кварцем, чего нет у нити?
  2. Что дает мне использование runable, чего не дает использование задания quartz?
  3. с точки зрения наилучшей практики, какие критерии следует использовать для выбора между заданиями Quartz и управляемыми объектами в данном случае использования?
4 7

4 ответа:

С кварцем у вас есть много функций, "хорошо реализованных", таких как:

  • транзакция mgmt выполнения задания
  • сохраняемость заданий, чтобы мы знали состояние выполняемых заданий
  • поддержка кластеризации
  • Контроль планирования, даже если вам просто нужен простой триггер. Но это дает такую возможность.

Без его использования, вы должны контролировать их самостоятельно, некоторые проблемы могут быть сложными.

Запуск нового потока:

  • Легкий вес нет персистентность работы, кварцевый api и т. д.
  • ваше приложение работает без дополнительной зависимости (quartz)
  • источник ошибок (из кварца) был уменьшен

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

Если вас интересует только асинхронизация, вы можете просто запустить поток. Если были другие проблемы, такие как кластеризация, вы можете рассмотреть возможность использования кварца.

Я бы не стал добавлять Кварц в проект только для этой возможности, но если бы я уже установил кварц и уже использовал его, то, да, даже для одноразового использования я бы использовал одноразовую непосредственную работу кварца.

Причина - просто последовательность. Quartz уже управляет всеми деталями потока и процесса задания. Одна нить проста, но мы также знаем по опыту, что даже одна нить может быть не простой.

Кварц оборачивает нить в концепцию высокого уровня (the Иов), и все то, что он приносит с собой.

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

Накладные расходы абстракции и условия, которые делают работу кварца, недостаточно значительны, чтобы просто использовать поток в этом случае, потому что "это легче вес".

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

Если это одноразовая работа и нет никаких дополнительных требований, таких как постоянство работы, планирование и т. д. тогда вам будет лучше с обычными нитями.

    Задания Quartz гораздо более надежны, чем обычные потоки, и поддерживают планирование, сохранение заданий и т. д. все остальное, что вам, вероятно, не нужно.
  1. Не нужно ничего настраивать с Runnables и Threads
  2. Если вы думаете, что может быть больше заданий, чем это, запланированные задания, отложенные задания и т. д., У вас есть 2 варианта: идите со стандартными Экскьюторами Java. Создайте пул потоков и используйте его для выполнения заданий. Вы также можете использовать абстракцию Spring TaskExecutor, чтобы вы могли легко переключаться между Quartz и Executors, когда вам это нужно. Но это кажется излишеством для одноразового концерта.

Для непосредственной задачи 1 раз будет достаточно потоков. Но есть лучшие плагины, такие как quartz, Spring Scheduler