Есть ли что-то неправильное в запуске нескольких планировщиков в веб-приложении?

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

Основные причины этого:

  • В этом контексте краткосрочные задачи являются более важными, чем длительные задачи (короткие задачи должны выполняться каждую минуту, а длинные — раз в час).
  • Если я настроил однопоточный режим, длительные задачи будут блокировать короткие задачи.
  • Если я неправильно настроил размер пула потоков, длительные задачи потенциально могут заблокировать короткие задачи.

Есть ли что-то неправильное в разделении задач на отдельные планировщики, подобные этому, или соглашение всегда использовать один планировщик в приложении и увеличивать размер пула?

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


person Shiraaz.M    schedule 16.07.2014    source источник
comment
какую версию кварца вы используете?   -  person Sumeet Sharma    schedule 16.07.2014
comment
@SumeetSharma Я думал о кварце в сочетании с Spring, но решил использовать собственное планирование Spring.   -  person Shiraaz.M    schedule 16.07.2014
comment
Я считаю, что работать с кварцем намного проще, поэтому я предложил именно этот способ. Я лично считаю, что вы можете легко редактировать конфигурацию, когда используете кварц напрямую.   -  person Sumeet Sharma    schedule 16.07.2014


Ответы (3)


Я рекомендую вам настроить две отдельные задачи, используя запланированные методы Spring.

@Async
@Scheduled(cron = "your cron expresion")
public void task1(){

}

@Async
@Scheduled(cron = "your cron expresion")
public void task2(){

}
person paul    schedule 16.07.2014

Если вы используете Quartz 2.0, у вас может быть несколько (некластеризованных) экземпляров планировщика, использующих один и тот же набор таблиц Quartz, пока они имеют unique instance names. Таким образом, вы можете просто configure separate thread pool sizes назначить критичные задания одному планировщику, а менее критичные — другому. Кроме того, во всех кварцевых таблицах есть столбцы SCHED_NAME, поэтому задания можно легко разделить с помощью имен экземпляров планировщика.

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

person Sumeet Sharma    schedule 16.07.2014

Вы МОЖЕТЕ настроить несколько планировщиков. НО вы должны (и вы должны) рассмотреть возможность установки правильного пула потоков. У нас есть аналогичный случай, когда несколько задач запускаются каждый час, а затем несколько запускаются каждую ночь. Установка правильного corePoolSize и maxPoolSize является ключом к успеху при планировании нескольких заданий. Наряду с этим у вас всегда есть возможность настроить queueCapacity, чтобы сохранить день, когда достигнут предел потока.

person Puneetsri    schedule 16.07.2014