Каков наилучший способ запланировать выполнение задачи весной загрузки

В настоящее время я разрабатываю приложение на основе Spring-Boot.

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

Я уже прочитал задание Spring Spring schedinging - запускается только один раз, но это странно всегда "новый" localExecutor в приложении Spring.

Таким образом, как только пользователь планирует рассылать электронное письмо, мне нужно "новое" localExecutor для его задачи.

Итак, есть ли лучшие способы?

Ответ 1

вы должны использовать quartz-scheduler и send mails at different time and send only once. - Поместите это как бизнес-логику в свой код. См. Интеграцию с загрузкой весны -quartz https://github.com/davidkiss/spring-boot-quartz-demo

Ответ 2

Самый простой способ запланировать задачи весной - создать метод, аннотированный @Scheduled в управляемом весной компоненте. Он также требовал @EnableScheduling в любых классах @Configuration.

Весенний учебник

Ответ 3

Вы можете использовать crontab внутри @Scheduled

 private AtomicInteger counter = new AtomicInteger(0);

@Scheduled(cron = "*/2 * * * * *")
public void cronJob() {
    int jobId = counter.incrementAndGet();
    System.out.println("Job " + new Date() + ", jobId: " + jobId);
}

Ответ 4

Вы можете использовать Quartz Scheduler.

Quartz - это многофункциональная библиотека с открытым исходным кодом, которая может быть интегрирована практически в любое приложение Java - от самого маленького автономного приложения до самой большой системы электронной коммерции. Кварц можно использовать для создания простых или сложных графиков выполнения десятков, сотен или даже десятков тысяч заданий; задания, задачи которых определены как стандартные компоненты Java, которые могут выполнять практически все, что вы можете их запрограммировать. Кварцевый планировщик включает в себя множество функций корпоративного класса, таких как поддержка транзакций JTA и кластеризация.

Вы можете найти несколько блогов, иллюстрирующих, как использовать кварц в весенней загрузке, включая определение bean-компонентов JobDetail, Trigger, фабрики и т.д., Которые немного перегружены и громоздки.

Есть простой способ сделать то же самое.

Вы можете попробовать https://github.com/mejariamol/quartz-easy. Эта библиотека упрощает интеграцию кварцевого планировщика в среду весенней загрузки. Я придумал это при настройке кварцевого планировщика в одном из проектов на работе.

  1. Аннотируйте свою реализацию Job с помощью запланированных аннотаций с необходимой конфигурацией, задав подходящие поля, присутствующие в аннотации.
import com.indusnode.quartz.annotation.Scheduled;
...
@Scheduled(interval="5", intervalType=Scheduled.IntervalType.SEC)
class TestJob implements Job {
    //...
}
  1. Установите свойство приложения qe.base-package качестве имени базового пакета проекта, который будет содержать все ваши реализации заданий. Также добавьте com.indusnode в качестве значения для basePackage при сканировании компонентов.
  2. И все готово! Нет необходимости определять фабрики, JobDetail, триггеры и т.д.

Чтобы использовать эту библиотеку, pom.xml quartz-easy в quartz-easy артефакт в разделе зависимостей вашего pom.xml

<dependency>
  <groupId>com.indusnode</groupId>
  <artifactId>quartz-easy</artifactId>
  <version>1.0.0</version>
</dependency>

Для получения дополнительной информации, пожалуйста, обратитесь https://search.maven.org/artifact/com.indusnode/quartz-easy/1.0.0/jar

Ответ 5

При весенней загрузке мы можем реализовать планировщик несколькими способами, но здесь мы используем аннотацию для реализации планировщика. При весенней загрузке мы можем реализовать планировщик, используя аннотацию @Scheduled. Аннотация @Scheduled внутренне использует интерфейс TaskScheduler для планирования задачи. Чтобы включить аннотацию @Scheduled, мы должны использовать аннотацию @EnableScheduling в файле конфигурации.

Посетите https://developervillage.blogspot.com/2019/05/schedulertask-executor-in-spring-boot.html для получения полной информации со всей конфигурацией.