Úvod do kremeňa

1. Prehľad

Kremeň je open source rámec plánovania úloh napísaný výlučne v prostredí Java a navrhnutý na použitie v obidvoch formách J2SE a J2EE aplikácie. Ponúka veľkú flexibilitu bez obetovania jednoduchosti.

Môžete vytvoriť zložité plány vykonania akejkoľvek úlohy. Príkladom sú napr. úlohy, ktoré bežia denne, každý druhý piatok o 19:30 hod. alebo iba posledný deň každého mesiaca.

V tomto článku sa pozrieme na prvky na vytvorenie úlohy pomocou API Quartz. Na úvod v kombinácii s jarou odporúčame plánovanie jari s kremeňom.

2. Maven závislosti

Musíme pridať nasledujúcu závislosť do pom.xml:

 org.quartz-scheduler quartz 2.3.0 

Najnovšiu verziu nájdete v úložisku Maven Central.

3. API Quartz

Srdcom rámca je Plánovač. Je zodpovedný za správu runtime prostredia pre našu aplikáciu.

Kvôli zaisteniu škálovateľnosti je Quartz založený na architektúre s viacerými vláknami. Po spustení rámec inicializuje množinu pracovných vlákien ktoré používajú Plánovač vykonať Pracovné miesta.

Takto môže rámec fungovať veľa Pracovné miesta súbežne. Spolieha sa tiež na voľne prepojenú sadu ThreadPool komponenty pre správu pre správu prostredia vlákna.

Kľúčové rozhrania API sú:

  • Plánovač - primárne API pre interakciu s plánovačom rámca
  • Práca - rozhranie, ktoré sa má implementovať pomocou komponentov, ktoré si prajeme nechať vykonať
  • JobDetail - používa sa na definovanie inštancií Jobs
  • Spúšťač - komponent, ktorý určuje rozvrh, podľa ktorého je daný Job sa uskutoční
  • JobBuilder - slúžila na stavbu JobDetail inštancie, ktoré definujú inštancie Pracovné miesta
  • TriggerBuilder - slúžila na stavbu Spúšťač inštancie

Pozrime sa na každú z týchto súčastí.

4. Plánovač

Skôr ako môžeme použiť Plánovač, je potrebné vytvoriť inštanciu. K tomu môžeme použiť továreň SchedulerFactory:

SchedulerFactory schedulerFactory = nový StdSchedulerFactory (); Plánovač plánovača = schedulerFactory.getScheduler ();

A PlánovačŽivotný cyklus je ohraničený jeho vytvorením prostredníctvom a SchedulerFactory a volanie na jeho vypnúť() metóda. Po vytvorení Plánovač rozhranie je možné použiť na pridanie, odstránenie a zoznam Pracovné miesta a Spúšťačea vykonávať ďalšie operácie spojené s plánovaním (napríklad pozastaviť spúšťač).

Avšak the Plánovač nebude pôsobiť na žiadne spúšťače, kým sa nezačne s štart () metóda:

scheduler.start ();

5. Pracovné miesta

A Job je trieda, ktorá implementuje Job rozhranie. Má iba jednu jednoduchú metódu:

public class SimpleJob implementuje Job {public void execute (JobExecutionContext arg0) hodí JobExecutionException {System.out.println ("Toto je kremenná úloha!"); }}

Keď Job’s spúšťací oheň, vykonať () metóda je vyvolaná jedným z pracovných vlákien plánovača.

The JobExecutionContext objekt, ktorý sa odovzdáva tejto metóde, poskytuje inštancii úlohy s informáciami o jej behovom prostredí, popisovači do Plánovač ktorý to vykonal, kľučka k Spúšťač ktoré spustili popravu, úloha JobDetail objekt a niekoľko ďalších položiek.

The JobDetail objekt vytvoril klient Quartz v čase Job sa pridáva k Plánovač. Je to v podstate definícia inštancie úlohy:

JobDetail job = JobBuilder.newJob (SimpleJob.class) .withIdentity ("myJob", "group1") .build ();

Tento objekt môže obsahovať aj rôzne nastavenia vlastností pre Job, ako aj a JobDataMap, ktoré možno použiť na ukladanie informácií o stave pre danú inštanciu našej pracovnej triedy.

5.1. JobDataMap

The JobDataMap sa používa na uchovanie ľubovoľného množstva údajových objektov, ktoré chceme sprístupniť inštancii úlohy pri jej vykonávaní. JobDataMap je implementácia Java Mapa rozhranie a má niekoľko pridaných pohodlných metód na ukladanie a načítanie údajov primitívnych typov.

Tu je príklad vloženia údajov do JobDataMap pri stavbe JobDetail, pred pridaním úlohy do plánovača:

JobDetail job = newJob (SimpleJob.class) .withIdentity ("myJob", "group1") .usingJobData ("jobSays", "Hello World!") .UsingJobData ("myFloatValue", 3.141f) .build ();

A tu je príklad toho, ako získať prístup k týmto údajom počas vykonávania úlohy:

public class SimpleJob implementuje Job {public void execute (JobExecutionContext context) hodí JobExecutionException {JobDataMap dataMap = context.getJobDetail (). getJobDataMap (); Reťazec jobSays = dataMap.getString ("jobSays"); float myFloatValue = dataMap.getFloat ("myFloatValue"); System.out.println ("Job hovorí:" + jobSays + "a val je:" + myFloatValue); }}

Vyššie uvedený príklad vytlačí „Job says Hello World !, and val is 3.141“.

Do našej pracovnej triedy môžeme pridať aj nastavovacie metódy, ktoré zodpovedajú názvom kľúčov v JobDataMap.

Ak to urobíme, použije sa predvolene Quartz JobFactory implementácia automaticky zavolá týchto nastavovačov, keď je úloha vytvorená inštanciou, čím sa zabráni potrebe explicitne dostať hodnoty z mapy v rámci našej metódy vykonania.

6. Spúšťače

Spúšťač objekty sa používajú na spustenie vykonávania Pracovné miesta.

Keď si prajeme naplánovať a Job, musíme vytvoriť inštanciu spúšťača a upraviť jeho vlastnosti, aby sme mohli nakonfigurovať naše požiadavky na plánovanie:

Spúšťač spúšte = TriggerBuilder.newTrigger () .withIdentity ("myTrigger", "group1") .startNow () .withSchedule (SimpleScheduleBuilder.simpleSchedule () .withIntervalInSeconds (40) .repeatForever ()) .build

A Spúšťač môže mať aj a JobDataMap s tým spojené. To je užitočné pri odovzdávaní parametrov do a Job ktoré sú špecifické pre vykonanie spúšťača.

Existujú rôzne typy spúšťačov pre rôzne potreby plánovania. Každá má inú TriggerKey vlastnosti na sledovanie ich totožnosti. Niektoré ďalšie vlastnosti sú však spoločné pre všetky typy spúšťačov:

  • The jobKey property označuje identitu úlohy, ktorá by sa mala vykonať pri spustení spúšťača.
  • The Doba spustenia Vlastnosť označuje, kedy plán spúšťača prvýkrát vstúpi do platnosti. Hodnota je a java.util.Date objekt, ktorý definuje časový okamih pre daný kalendárny dátum. U niektorých typov spúšťačov sa spúšťač spúšťa v daný čas spustenia. Pre ostatných to jednoducho znamená čas, ktorým by sa mal rozvrh začať.
  • The endTime vlastnosť označuje, kedy by sa mal rozvrh spúšťača zrušiť.

Kremeň sa dodáva s niekoľkými rôznymi typmi spúšťačov, ale najbežnejšie používané sú SimpleTrigger a CronTrigger.

6.1. Priorita

Niekedy, keď máme veľa spúšťačov, nemusí mať Quartz dostatok zdrojov na okamžité spustenie všetkých úloh, ktoré sú naplánované na spustenie súčasne. V takom prípade môžeme chcieť určiť, ktorý z našich spúšťačov bude dostupný ako prvý. To je presne to, čo prioritou sa použije vlastnosť na spúšti.

Napríklad, keď je nastavených desať spúšťačov súčasne a sú k dispozícii iba štyri pracovné vlákna, najskôr sa vykonajú prvé štyri spúšťače s najvyššou prioritou. Ak na spúšťači nenastavíme prioritu, použije sa predvolená priorita päť. Akákoľvek celočíselná hodnota je povolená ako priorita, kladná alebo záporná.

V príklade nižšie máme dva spúšťače s inou prioritou. Ak nie je dostatok zdrojov na spustenie všetkých spúšťačov súčasne, spúšťačA bude prepustený ako prvý:

Trigger triggerA = TriggerBuilder.newTrigger () .withIdentity ("triggerA", "group1") .startNow () .withPriority (15) .withSchedule (SimpleScheduleBuilder.simpleSchedule () .withIntervalInSeconds (40).) ; Trigger triggerB = TriggerBuilder.newTrigger () .withIdentity ("triggerB", "group1") .startNow () .withPriority (10) .withSchedule (SimpleScheduleBuilder.simpleSchedule () .withIntervalInSeconds (20).) ;

6.2. Pokyny na vynechanie zážehu

K vynechaniu zapaľovania dôjde, ak pretrváva spúšť chýba jeho čas streľby kvôli Plánovač vypínanie alebo v prípade, že v skupine vlákien spoločnosti Quartz nie sú k dispozícii žiadne vlákna.

Rôzne typy spúšťačov majú k dispozícii rôzne pokyny na vynechanie zážehu. V predvolenom nastavení používajú inteligentné pokyny pre politiku. Po spustení plánovača vyhľadá všetky trvalé spúšťače, ktoré zlyhali. Potom aktualizuje každého z nich na základe individuálne nakonfigurovaných pokynov na vynechanie zážehu.

Pozrime sa na nižšie uvedené príklady:

Spúšťač misFiredTriggerA = TriggerBuilder.newTrigger () .startAt (DateUtils.addSeconds (nový dátum (), -10)) .build (); Spúšťač misFiredTriggerB = TriggerBuilder.newTrigger () .startAt (DateUtils.addSeconds (nový dátum (), -10)) .withSchedule (SimpleScheduleBuilder.simpleSchedule () .withMisfireHandlingInstructionFireNow ())

Spúšťač sme naplánovali tak, aby sa spustil pred 10 sekundami (teda do vytvorenia oneskorenia je 10 sekúnd), aby sme simulovali zlyhanie, napr. pretože plánovač bol nefunkčný alebo nemal k dispozícii dostatočné množstvo pracovných vlákien. Samozrejme, v scenári zo skutočného sveta by sme také spúšťače nikdy nenaplánovali.

V prvom spúšťači (misFiredTriggerA) nie sú stanovené žiadne pokyny na manipuláciu so zlyhaním zážehu. Preto tzv inteligentná politika sa v takom prípade používa a nazýva sa: withMisfireHandlingInstructionFireNow (). To znamená, že úloha sa vykoná okamžite potom, čo plánovač zistí zlyhanie zapaľovania.

Druhý spúšťač výslovne definuje, aké správanie očakávame, keď dôjde k zlyhaniu. V tomto príklade sa stane rovnaká inteligentná politika.

6.3. SimpleTrigger

SimpleTrigger sa používa pre scenáre, v ktorých musíme vykonať prácu v konkrétnom časovom okamihu. Môže to byť presne raz alebo opakovane v konkrétnych intervaloch.

Príkladom môže byť spustenie úlohy v presnom termíne 13. januára 2018 presne o 0:20:00. Podobne môžeme začať v tom čase a potom ešte päťkrát, každých desať sekúnd.

V kóde nižšie dátum myStartTime bol predtým definovaný a slúži na zostavenie spúšťača pre jednu konkrétnu časovú značku:

Spúšťač SimpleTrigger = (SimpleTrigger) TriggerBuilder.newTrigger () .withIdentity ("trigger1", "group1") .startAt (myStartTime) .forJob ("job1", "group1") .build ();

Ďalej zostavme spúšťač pre konkrétny časový okamih a potom opakujeme každých desať sekúnd desaťkrát:

Spúšťač SimpleTrigger = (SimpleTrigger) TriggerBuilder.newTrigger () .withIdentity ("trigger2", "group1") .startAt (myStartTime) .withSchedule (simpleSchedule () .withIntervalInSeconds (10) .withRepeatCount (10). ) .build ();

6.4. CronTrigger

The CronTrigger sa používa, keď potrebujeme plány založené na výpisoch podobných kalendáru. Napríklad môžeme určiť plány streľby ako napr každý piatok napoludnie alebo každý pracovný deň o 9:30 hod.

Cron-Expressions sa používajú na konfiguráciu inštancií CronTrigger. Tieto výrazy pozostávajú z Struny ktoré sú tvorené siedmimi podvýrazmi. Tu si môžeme prečítať viac informácií o Cron-Expressions.

V príklade nižšie zostavujeme spúšť, ktorá sa spúšťa každú druhú minútu medzi 8:00 a 17:00 každý deň:

CronTrigger trigger = TriggerBuilder.newTrigger () .withIdentity ("trigger3", "group1") .withSchedule (CronScheduleBuilder.cronSchedule ("0 0/2 8-17 * *?")) .ForJob ("myJob", "group1") ) .build ();

7. Záver

V tomto článku sme si ukázali, ako postaviť Plánovač spustiť a Job. Videli sme tiež niektoré z najbežnejších použitých možností spúšťania: SimpleTrigger a CronTrigger.

Kremeň možno použiť na vytvorenie jednoduchých alebo zložitých plánov na vykonávanie desiatok, stoviek alebo dokonca ďalších úloh. Viac informácií o rámci sa nachádza na hlavnej webovej stránke.

Zdrojový kód príkladov nájdete na GitHub.


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