java : 11
springBoot : 2.7.5
Част 1: Научете за Quartz Scheduler
Част 2: Внедряване на Scheduler с Quartz Scheduler със SpringBoot
част 3 :Прилагане на изпращане на сигнали в определени часове на потребител с QuartzScheduler

Ще напиша поредица от това, което научих, докато прилагах услугата за насочени известия с помощта на Quartz Scheduler

Тази статия обяснява теоретичното съдържание и настройката на средата

Когато работите по проект, понякога трябва да изпълнявате метод на всеки определен период от време и цикъл
Повечето биха използвали spring scheduler

Ще използвам Quartz Job Scheduler, за да създавам прости или сложни графици

Какво е кварц?

Quartz е библиотека за планиране на работа, разработена от
компания, наречена Terracotta.
Quartz може да изпълнява десетки до хиляди задачи и поддържа сложно планиране в прости интервални формати или Cron изрази.
Например, можете посочете какво да правите всеки петък в 1:30 сутринта, какво да правите в последния ден от месеца или какво да правите пет минути преди определен час

Предимства и недостатъци

Както винаги, всяка технология има своите плюсове и минуси

Професионалисти

  1. Осигурява клъстериране между планировчици на базата на DB
  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 е обект, който съхранява информация, която е налична, когато екземплярът на Job се изпълнява

JobDetail

Това е обект, който съдържа информация за изпълнение на заданието
Включва име на задание, група, атрибут 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.
Тригерът съдържа условие за планиране(напр. брой итерации, начален час)за изпълнение на заданието, а планировчикът изпълнява заданието въз основа на тази информация.

Връзката между Trigger и Job

  • Задействане (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();
    }

Инструкции за прекъсване на запалването

Прекъсване на запалването означава неуспех на операцията
Възниква, когато Scheduler излезе или когато няма налични нишки в пула от нишки
Поддържа различни политики за това как Scheduler обработва задействания на Misfire

  • MISFIRE_INSTRUCTION_FIRE_NOW
  • MISFIRE_INSTRUCTION_DO_NOTHING

Слушател

Listener е интерфейс, предоставен от Quartz за получаване на събития от Scheduler

  • JobListener
    Работи при стартиране и приключване на задание
  • TriggerListener
    Можете да получите събитие при възникване или неуспех на задействане или при завършване на задействане

JobStore

Заданието и тригерът могат да се съхраняват в паметта или DB

Кварцови компоненти

Вижте връзката по-долу за повече информация



В следващата статия ще обясня как да го внедря

можете да видите кода в моя gitHub