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