Plánovanie na jar s kremeňom

1. Prehľad

V tomto výučbe zostavíme jednoduchý Plánovač na jar s kremeňom.

Začneme s jednoduchým cieľom - ľahko nakonfigurovať novú naplánovanú úlohu.

1.1. Kľúčové súčasti API Quartz

Kremeň má modulárnu architektúru. Skladá sa z niekoľkých základných komponentov, ktoré je možné podľa potreby kombinovať. V tejto príručke sa zameriame na tie, ktoré sú spoločné pre každú prácu: Job, JobDetail, Spúšťač aPlánovač.

Aj keď na správu aplikácie použijeme Spring, každý jednotlivý komponent sa dá nakonfigurovať dvoma spôsobmi: Kremeň spôsobom alebo Jar spôsobom (s využitím svojich tried pohodlia).

Pre úplnosť sa budeme venovať obom, pokiaľ je to možné, ale môžu byť prijaté. Začnime stavať po jednom komponente.

2. Job a JobDetail

2.1. Job

API poskytuje a Job rozhranie, ktoré má iba jednu metódu - vykonať. Musí to implementovať trieda, ktorá obsahuje skutočnú prácu, ktorá sa má vykonať, tj. Úlohu. Keď sa aktivuje spúšťač úlohy, plánovač vyvolá vykonať metóda, jej absolvovanie a JobExecutionContext objekt.

The JobExecutionContext poskytuje inštancii úlohy informácie o jej behovom prostredí vrátane popisovača plánovača, popisovača spúšťača a príkazu úlohy JobDetail objekt.

V tomto rýchlom príklade - úloha deleguje úlohu na triedu služieb:

@ Verejná trieda komponentu SampleJob implementuje úlohu {@Autowired private SampleJobService jobService; public void execute (kontext JobExecutionContext) hodí JobExecutionException {jobService.executeSampleJob (); }} 

2.2. JobDetail

Zatiaľ čo úloha je ťažný kôň, kremeň neukladá skutočnú inštanciu triedy práce. Namiesto toho môžeme definovať inštanciu súboru Job pomocou JobDetail trieda. Trieda práce musí byť poskytnutá JobDetail aby to vedelo typu úlohy, ktorá sa má vykonať.

2.3. Kremeň JobBuilder

Kremeň JobBuilder poskytuje stavebné rozhranie API pre stavbu JobDetail subjekty.

@Bean public JobDetail jobDetail () {return JobBuilder.newJob (). OfType (SampleJob.class) .storeDurably () .withIdentity ("Qrtz_Job_Detail") .withDescription ("Invoke Sample Job service ...") .build (); }

2.4. Jar JobDetailFactoryBean

Jarné JobDetailFactoryBean poskytuje použitie fazule na konfiguráciu JobDetail inštancie. Ako názov úlohy používa názov jarnej fazule, pokiaľ nie je uvedené inak:

@Bean public JobDetailFactoryBean jobDetail () {JobDetailFactoryBean jobDetailFactory = nový JobDetailFactoryBean (); jobDetailFactory.setJobClass (SampleJob.class); jobDetailFactory.setDescription ("Vyvolať službu vzorovej úlohy ..."); jobDetailFactory.setDurability (true); vrátiť jobDetailFactory; }

Nová inštancia JobDetail sa vytvára pre každé vykonanie úlohy. The JobDetail objekt sprostredkuje podrobné vlastnosti úlohy. Po dokončení vykonávania sa odkazy na inštanciu zrušia.

3. Spúšť

A Spúšťač je mechanizmus plánovania a Job, teda a Spúšťač napríklad „prepustí“ výkon práce. Existuje jasné rozdelenie zodpovednosti medzi Job (pojem úlohy) a Spúšťač (mechanizmus plánovania).

Okrem tohoto Job, spúšťač potrebuje aj a typu ktoré je možné zvoliť na základe plánovacích požiadaviek.

Povedzme, že chceme naplánovať vykonanie našej úlohy raz za hodinu, na neurčito - môžeme použiť kremeň TriggerBuilder alebo jarné SimpleTriggerFactoryBean urobiť tak.

3.1. Kremeň TriggerBuilder

TriggerBuilder je API v štýle staviteľa na stavbu Spúšťač subjekt:

@Bean public Trigger trigger (JobDetail job) {return TriggerBuilder.newTrigger (). ForJob (job) .withIdentity ("Qrtz_Trigger") .withDescription ("Sample trigger") .withSchedule (simpleSchedule (). RepeatForever (). WithIntervalInHs )) .build (); }

3.2. Jar SimpleTriggerFactoryBean

SimpleTriggerFactoryBean poskytuje použitie fazule na konfiguráciu SimpleTrigger. Ako názov spúšťača používa názov jarnej fazule a predvolené nastavenie je na neurčité opakovanie, pokiaľ nie je uvedené inak:

@Bean public SimpleTriggerFactoryBean trigger (úloha JobDetail) {SimpleTriggerFactoryBean trigger = nový SimpleTriggerFactoryBean (); trigger.setJobDetail (úloha); trigger.setRepeatInterval (3600000); trigger.setRepeatCount (SimpleTrigger.REPEAT_INDEFINITELY); spätný spúšť; }

4. Konfigurácia JobStore

JobStore poskytuje úložný mechanizmus pre Job a Spúšťač, a je zodpovedná za údržbu všetkých údajov týkajúcich sa plánovača úloh. API podporuje oboje v pamäti a vytrvalý obchodoch.

4.1. V pamäti JobStore

Napríklad použijeme pamäť RAMJobStore ktorý ponúka bleskurýchly výkon a jednoduchú konfiguráciu prostredníctvom kremeň.vlastnosti:

org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore

Zjavná nevýhoda RAMJobStore je, že je prchavý v prírode. Medzi vypínaním sa stratia všetky plánovacie informácie. Ak sa medzi vypínaním musia udržiavať definície a plány úloh, je to trvalé JDBCJobStore namiesto toho sa musí použiť.

Povolenie pamäte JobStore na jar, nastavili sme túto vlastnosť v našom application.properties:

spring.quartz.job-store-type = pamäť

4.2. JDBC JobStore

Existujú dva typy JDBCJobStore: JobStoreTX a JobStoreCMT. Obaja vykonávajú rovnakú prácu s ukladaním plánovacích informácií do databázy.

Rozdiel medzi nimi je v tom, ako riadia transakcie, ktoré zadávajú údaje. The JobStoreCMT typu vyžaduje transakciu aplikácie na ukladanie údajov, zatiaľ čo JobStoreTX typ začína a riadi svoje vlastné transakcie.

Existuje niekoľko vlastností, ktoré je potrebné nastaviť pre a JDBCJobStore. Minimálne musíme určiť typ JDBCJobStore, zdroj údajov a trieda ovládača databázy. Pre väčšinu databáz existujú triedy ovládačov, ale StdJDBCDelegate pokrýva väčšinu prípadov:

org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.StdJDBCDelegate org.quartz.jobStore.dataSource = quartz

Nastavenie JDBC JobStore na jar urobí niekoľko krokov. Najskôr sme nastavili typ obchodu v našom application.properties:

spring.quartz.job-store-type = jdbc

Ďalej musíme povoliť automatickú konfiguráciu a dať Springu zdroj dát potrebný plánovačom Quartz. The @QuartzDataSource anotácia za nás robí ťažkú ​​prácu pri konfigurácii a inicializácii databázy Quartz:

@Configuration @EnableAutoConfiguration verejná trieda SpringQrtzScheduler {@Bean @QuartzDataSource verejné DataSource quartzDataSource () {return DataSourceBuilder.create (). Build (); }}

5. Plánovač

The Plánovač interface je hlavné API na prepojenie s plánovačom úloh.

A Plánovač možno vytvoriť inštanciu pomocou SchedulerFactory. Po vytvorení Jobs a Spúšťačje možné s ním zaregistrovať. Spočiatku Plánovač je v „pohotovostnom“ režime a jeho začať na spustenie vlákien, ktoré spúšťajú vykonávanie úloh, je potrebné vyvolať metódu.

5.1. Kremeň StdSchedulerFactory

Jednoduchým vyvolaním getScheduler metóda na StdSchedulerFactory, môžeme vytvoriť inštanciu Plánovač, inicializujte ho (s nakonfigurovaným JobStore a ThreadPool) a vrátiť popisovač do jeho API:

@Bean public Scheduler scheduler (Trigger trigger, JobDetail job, SchedulerFactoryBean factory) throws SchedulerException {Scheduler scheduler = factory.getScheduler (); scheduler.scheduleJob (job, trigger); scheduler.start (); plánovač návratov; }

5.2. Jar SchedulerFactoryBean

Jarné SchedulerFactoryBean poskytuje použitie fazuľových štýlov na konfiguráciu a Plánovač, riadi svoj životný cyklus v kontexte aplikácie a vystavuje Plánovač ako fazuľa na injekciu závislostí:

@Bean public SchedulerFactoryBean scheduler (Trigger trigger, JobDetail job, DataSource quartzDataSource) {SchedulerFactoryBean schedulerFactory = nový SchedulerFactoryBean (); schedulerFactory.setConfigLocation (nový ClassPathResource ("quartz.properties")); schedulerFactory.setJobFactory (springBeanJobFactory ()); schedulerFactory.setJobDetails (úloha); schedulerFactory.setTriggers (spúšťač); schedulerFactory.setDataSource (quartzDataSource); plánovač návratov; }

5.3. Konfigurácia SpringBeanJobFactory

The SpringBeanJobFactory poskytuje podporu pre vloženie kontextu plánovača, mapy údajov úlohy a spúšťania údajov ako vlastností do fazule úlohy pri vytváraní inštancie.

Chýba mu však podpora pre vkladanie odkazov na fazuľa z kontext aplikácie. Vďaka autorovi tohto blogového príspevku môžeme pridať automatické zapojenie podpora pre SpringBeanJobFactory ako:

@Bean public SpringBeanJobFactory springBeanJobFactory () {AutoWiringSpringBeanJobFactory jobFactory = nový AutoWiringSpringBeanJobFactory (); jobFactory.setApplicationContext (applicationContext); vrátiť jobFactory; }

6. Záver

To je všetko. Práve sme vytvorili náš prvý základný plánovač využívajúci rozhranie Quartz API a tiež jarné triedy pohodlia.

Kľúčovým príkladom tohto tutoriálu je, že sme dokázali nakonfigurovať úlohu iba s niekoľkými riadkami kódu a bez použitia akejkoľvek konfigurácie založenej na XML.

Kompletný zdrojový kód príklad je k dispozícii v tomto projekte github. Je to projekt Maven, ktorý je možné importovať a spustiť tak, ako je. Predvolené nastavenie používa Springove triedy pohodlia, ktoré je možné ľahko prepnúť na Quartz API s parametrom run-time (pozrite si README.md v úložisku).


$config[zx-auto] not found$config[zx-overlay] not found