Introduksjon til kvarts

1. Oversikt

Kvarts er en åpen kildekode-planlegging ramme skrevet helt i Java og designet for bruk i begge J2SE og J2EE applikasjoner. Det gir stor fleksibilitet uten å ofre enkelhet.

Du kan lage komplekse tidsplaner for utføring av en hvilken som helst jobb. Eksempler er f.eks. oppgaver som går daglig, annenhver fredag ​​klokka 19.30 eller bare den siste dagen i hver måned.

I denne artikkelen tar vi en titt på elementer for å bygge en jobb med Quartz API. For en introduksjon i kombinasjon med vår, anbefaler vi Planlegging om våren med kvarts.

2. Maven-avhengigheter

Vi må legge til følgende avhengighet til pom.xml:

 org.quartz-scheduler kvarts 2.3.0 

Den siste versjonen finner du i Maven Central repository.

3. Quartz API

Hjertet i rammeverket er Planlegger. Det er ansvarlig for å administrere kjøretidsmiljøet for applikasjonen vår.

For å sikre skalerbarhet er kvarts basert på en flerfarget arkitektur. Når det startes, initialiserer rammeverket et sett med arbeidertråder som brukes av Planlegger å henrette Arbeidsplasser.

Slik kan rammeverket kjøre mange Arbeidsplasser samtidig. Det er også avhengig av et løst koblet sett med ThreadPool ledelseskomponenter for styring av trådmiljøet.

Nøkkelgrensesnittene til API er:

  • Planlegger - det primære API-et for samhandling med planleggeren av rammeverket
  • Jobb - et grensesnitt som skal implementeres av komponenter som vi ønsker å ha utført
  • JobDetail - brukes til å definere forekomster av Jobbs
  • Utløser - en komponent som bestemmer tidsplanen for en gitt Jobb Vil bli utført
  • JobBuilder - brukt til å bygge JobDetail instanser, som definerer forekomster av Arbeidsplasser
  • TriggerBuilder - brukt til å bygge Avtrekker tilfeller

La oss ta en titt på hver av disse komponentene.

4. Planlegger

Før vi kan bruke Planlegger, det må instantieres. For å gjøre dette kan vi bruke fabrikken Planleggerfabrikk:

SchedulerFactory schedulerFactory = ny StdSchedulerFactory (); Planleggingsplanlegger = schedulerFactory.getScheduler ();

EN PlanleggerLivssyklus er avgrenset av sin opprettelse, via en Planleggerfabrikk og et kall til det skru av() metode. Når opprettet Planlegger grensesnitt kan brukes til å legge til, fjerne og liste opp Arbeidsplasser og Utløsere, og utfør andre planleggingsrelaterte operasjoner (for eksempel å stoppe en trigger midlertidig).

Derimot, de Planlegger vil ikke handle på noen utløsere før den er startet med start() metode:

scheduler.start ();

5. Jobber

EN Jobb er en klasse som implementerer Jobb grensesnitt. Den har bare en enkel metode:

offentlig klasse SimpleJob implementerer Job {public void execute (JobExecutionContext arg0) kaster JobExecutionException {System.out.println ("Dette er en kvartsjobb!"); }}

Når Arbeidsplasser utløse branner, den henrette() metoden blir påkalt av en av planleggerens arbeidertråder.

De JobExecutionContext objektet som sendes til denne metoden, gir jobbinstansen informasjon om kjøretidsmiljøet, et håndtak til Planlegger som utførte det, et håndtak til Avtrekker som utløste kjøringen, jobben JobDetail objekt, og noen få andre gjenstander.

De JobDetail objektet er opprettet av Quartz-klienten på det tidspunktet Jobb er lagt til Planlegger. Det er egentlig definisjonen av jobbinstansen:

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

Dette objektet kan også inneholde forskjellige eiendomsinnstillinger for Jobb, samt a JobDataMap, som kan brukes til å lagre tilstandsinformasjon for en gitt forekomst av jobbklassen vår.

5.1. JobDataMap

De JobDataMap brukes til å holde en mengde dataobjekter som vi ønsker å gjøre tilgjengelig for jobbforekomsten når den kjøres. JobDataMap er en implementering av Java Kart grensesnitt og har noen ekstra bekvemmelighetsmetoder for lagring og henting av data av primitive typer.

Her er et eksempel på å sette data i JobDataMap mens du bygger JobDetail, før du legger til jobben i planleggeren:

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

Og her er et eksempel på hvordan du får tilgang til disse dataene under utførelsen av jobben:

offentlig klasse SimpleJob implementerer Job {public void execute (JobExecutionContext context) kaster JobExecutionException {JobDataMap dataMap = context.getJobDetail (). getJobDataMap (); String jobSays = dataMap.getString ("jobSays"); flyte myFloatValue = dataMap.getFloat ("myFloatValue"); System.out.println ("Jobb sier:" + jobSays + ", og val er:" + myFloatValue); }}

Ovenstående eksempel vil skrive ut “Job sier Hello World !, og val er 3.141”.

Vi kan også legge til settermetoder i jobbklassen vår som tilsvarer navnene på nøklene i JobDataMap.

Hvis vi gjør dette, er Quartzs standard JobFactory implementering kaller automatisk disse setterne når jobben blir instantiert, og forhindrer dermed behovet for å eksplisitt få verdiene ut av kartet innenfor vår utførelsesmetode.

6. Utløsere

Avtrekker objekter brukes til å utløse kjøringen av Arbeidsplasser.

Når vi ønsker å planlegge en Jobb, må vi starte en trigger og justere egenskapene for å konfigurere planleggingskravene våre:

Trigger trigger = TriggerBuilder.newTrigger () .withIdentity ("myTrigger", "group1") .startNow () .withSchedule (SimpleScheduleBuilder.simpleSchedule () .withIntervalInSeconds (40) .repeatForever ()) .build ();

EN Avtrekker kan også ha en JobDataMap assosiert med det. Dette er nyttig for å overføre parametere til a Jobb som er spesifikke for utførelsene av utløseren.

Det finnes forskjellige typer utløsere for forskjellige planleggingsbehov. Hver og en har forskjellige TriggerKey egenskaper for å spore identiteten deres. Imidlertid er noen andre egenskaper felles for alle utløsertyper:

  • De jobKey egenskap indikerer identiteten til jobben som skal utføres når utløseren utløses.
  • De starttid egenskap indikerer når utløserplanen først trer i kraft. Verdien er en java.util.Date objekt som definerer et øyeblikk for en gitt kalenderdato. For noen utløsertyper, utløses avtrekkeren ved gitt starttid. For andre markerer det bare tiden planen skal starte.
  • De sluttid egenskap indikerer når utløserplanen skal avbrytes.

Kvarts leveres med en håndfull forskjellige utløsertyper, men de mest brukte er SimpleTrigger og CronTrigger.

6.1. Prioritet

Noen ganger, når vi har mange utløsere, kan det hende at kvarts ikke har nok ressurser til å umiddelbart si opp alle jobbene som er planlagt å fyre samtidig. I dette tilfellet vil vi kanskje kontrollere hvilke av utløserne som blir tilgjengelige først. Dette er akkurat hva prioritet egenskap på utløser brukes til.

For eksempel, når ti utløsere er satt til å fyre samtidig og bare fire arbeidertråder er tilgjengelige, vil de første fire utløserne med høyest prioritet bli utført først. Når vi ikke setter en prioritet på en utløser, bruker den en standardprioritet på fem. Enhver heltallverdi er tillatt som en prioritet, positiv eller negativ.

I eksemplet nedenfor har vi to utløsere med en annen prioritet. Hvis det ikke er nok ressurser til å skyte ut alle utløserne samtidig, triggerA blir den første som får sparken:

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

6.2. Misfire Instruksjoner

Et feilbrann oppstår hvis en vedvarende utløser savner sin avfyringstid på grunn av Planlegger blir stengt, eller i tilfelle det ikke er noen tilgjengelige tråder i Quartzs trådbasseng.

De forskjellige utløsertypene har forskjellige feilfeilinstruksjoner tilgjengelig. Som standard bruker de en smart policyinstruksjon. Når planleggeren starter, søker den etter eventuelle vedvarende utløsere som har blitt feil. Deretter oppdaterer den hver av dem basert på deres individuelt konfigurerte feilfeilinstruksjoner.

La oss ta en titt på eksemplene nedenfor:

Trigger misFiredTriggerA = TriggerBuilder.newTrigger () .startAt (DateUtils.addSeconds (new Date (), -10)) .build (); Trigger misFiredTriggerB = TriggerBuilder.newTrigger () .startAt (DateUtils.addSeconds (new Date (), -10)) .withSchedule (SimpleScheduleBuilder.simpleSchedule () .withMisfireHandlingInstructionFireNow ()) .build ();

Vi har planlagt at utløseren skal kjøre for 10 sekunder siden (så det er 10 sekunder forsinket når den er opprettet) for å simulere feilfeil, f.eks. fordi planleggeren var nede eller ikke hadde tilstrekkelig mengde arbeidertråder tilgjengelig. Selvfølgelig, i et virkelig scenario, ville vi aldri planlegge utløsere som dette.

I den første utløseren (misFiredTriggerA) ingen håndteringsinstruksjoner for feilfeil er angitt. Derfor kalles det smart politikk brukes i så fall og kalles: withMisfireHandlingInstructionFireNow (). Dette betyr at jobben utføres umiddelbart etter at planleggeren oppdager feilfeilen.

Den andre utløseren definerer eksplisitt hva slags oppførsel vi forventer når feilutløsing oppstår. I dette eksemplet skjer det bare å være den samme smarte politikken.

6.3. SimpleTrigger

SimpleTrigger brukes til scenarier der vi trenger å utføre en jobb på et bestemt tidspunkt. Dette kan enten være nøyaktig en gang eller gjentatte ganger med bestemte intervaller.

Et eksempel kan være å si opp en jobbutførelse nøyaktig 00:20:00 13. januar 2018. Tilsvarende kan vi starte på den tiden, og deretter fem ganger til, hvert tiende sekund.

I koden nedenfor, datoen myStartTime har tidligere blitt definert og brukes til å bygge en utløser for en bestemt tidsstempel:

SimpleTrigger trigger = (SimpleTrigger) TriggerBuilder.newTrigger () .withIdentity ("trigger1", "group1") .startAt (myStartTime) .forJob ("job1", "group1") .build ();

Deretter la oss bygge en utløser for et bestemt øyeblikk, og deretter gjenta hvert tiende sekund ti ganger:

SimpleTrigger trigger = (SimpleTrigger) TriggerBuilder.newTrigger () .withIdentity ("trigger2", "group1") .startAt (myStartTime) .withSchedule (simpleSchedule () .withIntervalInSeconds (10) .withRepeatCount (10)) .forJob ("job") ) .bygge();

6.4. CronTrigger

De CronTrigger brukes når vi trenger tidsplaner basert på kalenderlignende uttalelser. For eksempel kan vi spesifisere skyteplaner som hver fredag ​​klokka 12.00 eller hver ukedag klokka 9:30.

Cron-Expressions brukes til å konfigurere forekomster av CronTrigger. Disse uttrykkene består av Strenger som består av syv underuttrykk. Vi kan lese mer om Cron-Expressions her.

I eksemplet nedenfor bygger vi en utløser som utløses hvert annet minutt mellom klokken 8 og 17 hver dag:

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

7. Konklusjon

I denne artikkelen har vi vist hvordan man bygger en Planlegger å utløse en Jobb. Vi så også noen av de vanligste triggeralternativene som ble brukt: SimpleTrigger og CronTrigger.

Kvarts kan brukes til å lage enkle eller komplekse tidsplaner for å utføre dusinvis, hundrevis eller enda flere jobber. Mer informasjon om rammeverket finner du på hovednettstedet.

Kildekoden til eksemplene finner du på GitHub.


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