Работа с шедулером в Java (Spring)
Недавно, в процессе работы, я столкнулся с задачей управления шедулерами в работающем приложении. У нас серверное приложение, и в конфигурационных файлах Spring мы указывали, какие задачи запускать по таймеру. Однако, далее появилась следующая задача: убирать из списка выполнения эти задачи или же менять cron-таймер, при этом не тормозя приложение.
В процессе гугления и чтения, я нашел, как это сделать. Всё оказалось гораздо проще, чем я думал. Но для того, чтобы это понять пришлось немного почитать.
Вероятно, эта статья будет полезна новичкам, но, возможно, и мастодонты почерпнут для себя что-то новое.
Используемые термины:
Шедулер — управляет таймерами запуска задач
Джоб — конкретная задача, запускаемая по таймеру
Триггер — условие выполнения задачи — задает временные рамки запуска задач и их выполнения
Соответственно, шедулер содержит в себе описания всех задачи и триггеров к ним.
В системе используется шедулер, который описан в конфигурационном файле системы (shedulers.xml):
Пример джоб (и сервиса, метод которого он вызывает):
Где targetObject указывает класс-сервис (бин), в котором содержится метод, который необходимо запускать по таймеру. В targetMethod указываем название метода.
В этом триггере мы указываем джоб, который будем выполнять по триггеру (в данном случае это plannedVacationServiceJob, тоже бин), а так же укажем в формате cron режим и периодичность запуска задачи.
Теперь о том, как управлять шедулером.
Для управления этим шедулером, необходимо в контроллере (сервисе) подключить этот бин (в нашем случае это SchedulerFactoryBean).
У этой фабрики есть конкретный используемый шедулер, его можно получить методом getScheduler(). И уже через него управлять джобами, триггерами да и самими задачами.
Рассмотрим методы шедулера для остановки и запуска джобов:
pauseJob(String name, String Group) — остановить выполнение задачи шедулера в указанной группе джобов. Остановка происходит путём остановки соответствующего триггера (см. pauseTrigger)
resumeJob(String name, String Group) — возобновить выполнение задачи шедулера в указанной группе джобов. Восстановление происходит путём запуска соответствующего триггера (см. resumeTrigger)
pauseTrigger(String name, String Group) — останавливает триггер в соответствующей группе
resumeTrigger(String name, String Group) — возобновляет работу триггера в соответсвующей группе
pauseAll — останавливает все задачи шедулера (pauseJobs(String group) — только у конкретной группы)
resumeAll — возобновляет запуск всех задач шедулера (см. также resumeJobs)
А так же, ниже в примере, приводится код как можно посмотреть все задачи у группы джобов, и список всех имеющихся групп в шедулере. По умолчанию, если у джобов не указаны группы, то им присваивается группа DEFAULT.
Можно инжектить (@Autowired) напрямую триггеры и управлять их планировщиком cron. В примере это plannedVacationServiceCronTrigger, у которого мы меняем CronExpression. Или же можно обратиться к триггеру через шедулер, вызвав метод getTrigger(String name, String group).
@Autowired @Qualifier("plannedVacationServiceCronTrigger") private CronTriggerBean plannedVacationServiceCronTrigger; @Autowired private SchedulerFactoryBean schedulerFactoryBean; public someMethod() < logger.info(plannedVacationServiceCronTrigger.getCronExpression()); plannedVacationServiceCronTrigger.setCronExpression("*/1 * * * * ?"); //schedulerFactoryBean.getScheduler().pauseJob("plannedVacationServiceJob", "DEFAULT"); schedulerFactoryBean.getScheduler().pauseTrigger("plannedVacationServiceCronTrigger", "DEFAULT"); for (String str : schedulerFactoryBean.getScheduler().getJobGroupNames())< logger.info(str); >for (String str : schedulerFactoryBean.getScheduler().getJobNames("DEFAULT")) < logger.info(str); >logger.info(schedulerFactoryBean.getScheduler().getTrigger("plannedVacationServiceJob", "DEFAULT").getCronExpression()); >
JobRunr — the best Java Scheduler?
In Java, a scheduler is a tool that allows you to execute tasks or jobs at a specific time or after a specific interval. This is useful for tasks such as sending emails, create recurring automated reports, batch import files from XML or JSON or performing any other type of automated task.
Which is the Best Scheduler for Java?
When it comes to choosing the best scheduler for Java, JobRunr stands out from the competition. While there are some other scheduler frameworks available for Java, including the standard java.util.TimerTask and java.util.concurrent.ScheduledExecutorService , Quartz and DB-Scheduler, JobRunr offers a number of advantages over these traditional frameworks. Features of JobRunr include:
- a really easy API that allows you to schedule any job with just one line of code or by means of the @Recurring annotation
- an embedded dashboard showing you the status of each job
- distributed execution over different JVM instances
- integration with various frameworks including Spring Boot, Micronaut and Quarkus.
Unlike Quartz, which is quite a heavy and complex framework, JobRunr is a more modern, lightweight, and easy-to-use scheduler. Additionally, JobRunr is designed with enterprise-grade capabilities, providing reliability, security, and support for large-scale production deployments.
What Types of Job Scheduling Exist?
When it comes to scheduling jobs in Java, there are three main types of scheduling to consider: direct execution, scheduled execution in the future, and recurring execution by means of a cron expression.
- Direct execution: This type of scheduling is used when you want a job to be executed immediately. It is often used for one-off tasks or to distribute load over multiple servers. JobRunr allows to create a one-off job by means the the enqueue function on the BackgroundJob class or the JobScheduler class.
Conclusion
JobRunr is probably the best choice for a scheduler in any Java project. With its modern features and simple API, you can quickly and easily create one-off jobs, schedule jobs to run at a specific time or after a specific interval.
JobRunr’s enterprise-grade capabilities ensure reliability, security, and support for large-scale production deployments, making it the ideal choice for any Java scheduling needs. And, it also comes with great support if you take a JobRunr Pro license.