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, что делать в последний день месяца или что делать за пять минут до определенного времени сильный>

За и против

Как всегда, у каждой технологии есть свои плюсы и минусы

Плюсы

  1. Обеспечивает кластеризацию между планировщиками на основе БД
  2. Поддерживает отказоустойчивость системы и случайное распределение нагрузки
  3. Предоставляет планировщик заданий в памяти
  4. Shutdown HookPlugin
    перехватывает событие выключения JVM и уведомляет об этом планировщик.
  5. LoggingJobHistoryPlugin
    Это может быть полезно для отладки, оставляя журнал для выполнения задания.
  6. Включает динамическое планирование
    может заставить контент, который работал в 9 часов сегодня, работать в 10 часов завтра без каких-либо изменений

Минусы

  1. Он предоставляет возможности кластеризации, но, поскольку это простой случайный подход, балансировка нагрузки между кластерами не является полной.
  2. Он не предоставляет пользовательский интерфейс, поэтому при необходимости его необходимо реализовать напрямую.
  3. История выполнения расписания не архивируется

Кварцевая архитектура и компоненты

Работа

интерфейс, который должен быть реализован компонентами, которые вы хотите выполнить планировщиком

@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