java : 11
springBoot : 2.7.5
Часть 1. Узнайте о Quartz Scheduler
Часть 2. Реализация планировщика с помощью Quartz Scheduler с помощью SpringBoot
часть 3:Реализуйте отправку оповещений в определенное время для каждого пользователя с помощью QuartzScheduler
Я напишу серию того, что я узнал, внедряя службу push-уведомлений с помощью Quartz Scheduler.
В этой статье объясняется теоретическое содержание и настройка среды
Когда вы работаете над проектом, вам иногда приходится запускать метод каждый определенный период времени и циклически
Большинство из них использовали бы spring scheduler
Я собираюсь использовать Quartz Job Scheduler для создания простых или сложных расписаний.
Что такое кварц?
Quartz — это библиотека планирования работы, разработанная
компанией Terracotta.
Quartz может выполнять от десятков до тысяч задач и поддерживает сложное планирование в простых интервальных форматах или выражениях Cron.
Например, вы можете указать, что делать каждую пятницу в 1:30, что делать в последний день месяца или что делать за пять минут до определенного времени сильный>
За и против
Как всегда, у каждой технологии есть свои плюсы и минусы
Плюсы
- Обеспечивает кластеризацию между планировщиками на основе БД
- Поддерживает отказоустойчивость системы и случайное распределение нагрузки
- Предоставляет планировщик заданий в памяти
- Shutdown HookPlugin
перехватывает событие выключения JVM и уведомляет об этом планировщик. - LoggingJobHistoryPlugin
Это может быть полезно для отладки, оставляя журнал для выполнения задания. - Включает динамическое планирование
может заставить контент, который работал в 9 часов сегодня, работать в 10 часов завтра без каких-либо изменений
Минусы
- Он предоставляет возможности кластеризации, но, поскольку это простой случайный подход, балансировка нагрузки между кластерами не является полной.
- Он не предоставляет пользовательский интерфейс, поэтому при необходимости его необходимо реализовать напрямую.
- История выполнения расписания не архивируется
Кварцевая архитектура и компоненты
Работа
интерфейс, который должен быть реализован компонентами, которые вы хотите выполнить планировщиком
@Slf4j @Component @PersistJobDataAfterExecution @DisallowConcurrentExecution public class SampleJob implements Job { @Autowired private TestRepository testRepository; @Override public void execute(JobExecutionContext context) throws JobExecutionException { System.out.println(this.getClass().getName() + "Sample Job Start! [ " + LocalDate.now() + " ]"); } }
Карта данных_задания
JobDataMap — это объект, в котором хранится информация, доступная при запуске экземпляра задания.
Сведения о задании
Это объект, который содержит информацию для выполнения задания
Включает имя задания, группу, атрибут JobDataMap и т. д.
public <T extends Job> JobDetail buildJobDetail(Class<? extends Job> job, SampleJobRequest request) { JobDataMap jobDataMap = new JobDataMap(); // job Data Map jobDataMap.put("executeCount", 1); // put Data return JobBuilder.newJob(job) .withIdentity(request.getJobName()) .withDescription(request.getJobDescription()) .usingJobData(jobDataMap) .build(); }
Триггер
Я думаю, что это основной объект Quartz Scheduler.
Триггер содержит условие планирования(например, количество итераций, время начала)для выполнения задания, и планировщик выполняет задание на основе эта информация.
Связь между триггером и заданием
- Триггер (1) : Задание(1)
Один триггер должен быть обозначен как одно задание - Триггер (N): Задание(1)
Одно задание может выполняться несколько раз в разное время. - Триггер (1) : Задание(N) (X)
Один триггер не может иметь более одного задания
Триггер Cron и простой триггер
- SimpleTrigger
Задание можно запустить в определенное время.
private Trigger buildTrigger() { SimpleTriggerFactoryBean triggerFactory = new SimpleTriggerFactoryBean(); triggerFactory.setName("SimpleTriggerName"); triggerFactory.setGroup("Group"); triggerFactory.setStartTime(localTimeToDate(LocalTime.now().plusHours(2))); triggerFactory.setRepeatCount(0); triggerFactory.setRepeatInterval(0); triggerFactory.afterPropertiesSet(); return triggerFactory.getObject(); }
- CronTrigger
Создайте триггер с помощьюcron
Он может создавать более сложные расписания(например, запуск каждые несколько минут с 14:00 до 16:00 в первый день каждого месяца)
private Trigger buildCronTrigger() { CronTriggerFactoryBean CrontriggerFactory = new CronTriggerFactoryBean(); CrontriggerFactory.setName("CronName"); CrontriggerFactory.setGroup("Group"); CrontriggerFactory.setCronExpression("2 * * * * *"); CrontriggerFactory.setMisfireInstruction(SimpleTrigger.MISFIRE_INSTRUCTION_FIRE_NOW); try { CrontriggerFactory.afterPropertiesSet(); } catch (ParseException e) { e.printStackTrace(); } return CrontriggerFactory.getObject(); }
Инструкции по осечкам
Осечка означает сбой операции
Происходит при выходе из планировщика или когда в пуле потоков нет доступных потоков
Поддержка различных политик обработки планировщиком триггеров осечки
- MISFIRE_INSTRUCTION_FIRE_NOW
- MISFIRE_INSTRUCTION_DO_NOTHING
Слушатель
Прослушиватель — это интерфейс, предоставляемый Quartz для получения событий от планировщика.
- JobListener
Работает при запуске и завершении задания - TriggerListener
Вы можете получать событие, когда триггер срабатывает или не срабатывает, или при выполнении триггера.
Магазин вакансий
Задание и триггер могут быть сохранены в памяти или БД
Кварцевые компоненты
Для получения дополнительной информации см. ссылку ниже
В следующей статье я объясню, как это реализовать
вы можете увидеть код в моем gitHub