Planlegging om våren med kvarts

1. Oversikt

I denne opplæringen bygger vi en enkel Planlegger om våren med kvarts.

Vi begynner med et enkelt mål i tankene - å enkelt konfigurere en ny planlagt jobb.

1.1. Nøkkelkomponenter i Quartz API

Kvarts har en modulær arkitektur. Den består av flere grunnleggende komponenter som kan kombineres etter behov. I denne opplæringen vil vi fokusere på de som er felles for hver jobb: Jobb, JobDetail, Avtrekker ogPlanlegger.

Selv om vi vil bruke Spring til å administrere applikasjonen, kan hver enkelt komponent konfigureres på to måter: Kvarts måte eller Vår måte (ved hjelp av bekvemmelighetsklasser).

Vi vil dekke begge deler så langt som mulig for fullstendighetens skyld, men begge kan bli adoptert. La oss begynne å bygge, en komponent om gangen.

2. Jobb og JobDetail

2.1. Jobb

API gir en Jobb grensesnitt som bare har en metode - henrette. Den må implementeres av klassen som inneholder det faktiske arbeidet som skal utføres, dvs. oppgaven. Når utløseren til en jobb utløses, påkaller planleggeren henrette metode, passerer den a JobExecutionContext gjenstand.

De JobExecutionContext gir jobbinstansen informasjon om kjøretidsmiljøet, inkludert et håndtak til planleggeren, et håndtak til utløseren og jobbens JobDetail gjenstand.

I dette raske eksemplet - delegerer jobben oppgaven til en serviceklasse:

@Component public class SampleJob implementerer jobb {@Autowired private SampleJobService jobService; public void execute (JobExecutionContext context) kaster JobExecutionException {jobService.executeSampleJob (); }} 

2.2. JobDetail

Mens jobben er arbeidshesten, lagrer ikke Quartz en faktisk forekomst av jobbklassen. I stedet kan vi definere en forekomst av Jobb bruker JobDetail klasse. Jobbens klasse må gis til JobDetail slik at den vet type av jobben som skal utføres.

2.3. Kvarts JobBuilder

Kvartset JobBuilder gir et bygg-API for konstruksjon JobDetail enheter.

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

2.4. Vår JobDetailFactoryBean

Vårens JobDetailFactoryBean gir bruk i bønnestil for konfigurering JobDetail tilfeller. Den bruker vårbønnenavnet som jobbenavn, hvis ikke annet er spesifisert:

@Bean public JobDetailFactoryBean jobDetail () {JobDetailFactoryBean jobDetailFactory = ny JobDetailFactoryBean (); jobDetailFactory.setJobClass (SampleJob.class); jobDetailFactory.setDescription ("Invoke Sample Job service ..."); jobDetailFactory.setDurability (true); return jobDetailFactory; }

En ny forekomst av JobDetail er opprettet for hver utførelse av jobben. De JobDetail objektet formidler de detaljerte egenskapene til jobben. Når utførelsen er fullført, henvises til forekomsten.

3. Utløser

EN Avtrekker er mekanismen for å planlegge en Jobb, dvs. a Avtrekker eksempel "fyrer" utførelsen av en jobb. Det er en klar skillet mellom ansvarsforhold mellom Jobb (begrepet oppgave) og Avtrekker (planleggingsmekanisme).

I tillegg til Jobb, utløseren trenger også en type som kan velges ut fra planleggingskravene.

La oss si, vi ønsker å planlegge oppgaven vår skal utføres en gang i timen, på ubestemt tid - vi kan bruke kvarts TriggerBuilder eller vårens SimpleTriggerFactoryBean å gjøre slik.

3.1. Kvarts TriggerBuilder

TriggerBuilder er et bygg-API for konstruksjon av Avtrekker enhet:

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

3.2. Vår SimpleTriggerFactoryBean

SimpleTriggerFactoryBean gir bruk i bønnestil for konfigurering SimpleTrigger. Den bruker vårbønnenavnet som utløsernavn og er standard til ubestemt repetisjon, hvis ikke annet er spesifisert:

@Bean offentlig SimpleTriggerFactoryBean-utløser (JobDetail-jobb) {SimpleTriggerFactoryBean-utløser = ny SimpleTriggerFactoryBean (); trigger.setJobDetail (jobb); trigger.setRepeatInterval (3600000); trigger.setRepeatCount (SimpleTrigger.REPEAT_INDEFINITELY); retur utløser; }

4. Konfigurere JobStore

JobStore gir lagringsmekanismen for Jobb og Avtrekker, og er ansvarlig for å opprettholde alle dataene som er relevante for jobbplanleggeren. API-et støtter begge deler i minne og vedvarende butikker.

4.1. I minne JobStore

For eksempel vil vi bruke in-memory RAMJobStore som tilbyr lynrask ytelse og enkel konfigurasjon via kvarts. eiendommer:

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

Den åpenbare ulempen med RAMJobStore er at det er det flyktige i naturen. All planleggingsinformasjonen går tapt mellom nedleggelser. Hvis stillingsdefinisjoner og tidsplaner må holdes mellom stenging, er den vedvarende JDBCJobStore må brukes i stedet.

For å aktivere et minne JobStore på våren, vi setter denne eiendommen i vår application.properties:

spring.quartz.job-store-type = minne

4.2. JDBC JobStore

Det er to typer JDBCJobStore: JobStoreTX og JobStoreCMT. De gjør begge den samme jobben med å lagre planleggingsinformasjon i en database.

Forskjellen mellom de to er hvordan de administrerer transaksjonene som begår dataene. De JobStoreCMT type krever en applikasjonstransaksjon for å lagre data, mens JobStoreTX type starter og administrerer sine egne transaksjoner.

Det er flere egenskaper å sette for en JDBCJobStore. Vi må som et minimum spesifisere typen JDBCJobStore, datakilden og databasedriverklassen. Det er sjåførklasser for de fleste databaser, men StdJDBCDelegate dekker de fleste tilfeller:

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

Sette opp en JDBC JobStore på våren tar noen få skritt. For det første setter vi butikktypen i vår application.properties:

spring.quartz.job-store-type = jdbc

Deretter må vi aktivere automatisk konfigurering og gi Spring den datakilden som kreves av Quartz-planleggeren. De @QuartzDataSource kommentar gjør det harde arbeidet med å konfigurere og initialisere Quartz-databasen for oss:

@Configuration @EnableAutoConfiguration offentlig klasse SpringQrtzScheduler {@Bean @QuartzDataSource public DataSource quartzDataSource () {return DataSourceBuilder.create (). Build (); }}

5. Planlegger

De Planlegger grensesnitt er hoved-API for grensesnitt med jobbplanleggeren.

EN Planlegger kan instantieres med en Planleggerfabrikk. Når du er opprettet, Jobbs og Avtrekkers kan registreres med den. Opprinnelig ble den Planlegger er i "stand-by" -modus, og dens start metoden må påberopes for å starte trådene som utløser utførelsen av jobber.

5.1. Kvarts StdSchedulerFactory

Ved å bare påkalle getScheduler metoden på StdSchedulerFactory, kan vi instantiere Planlegger, initialiser den (med den konfigurerte JobStore og ThreadPool), og returner et håndtak til APIen:

@Bean public Scheduler scheduler (Trigger trigger, JobDetail job, SchedulerFactoryBean factory) kaster SchedulerException {Scheduler scheduler = factory.getScheduler (); scheduler.scheduleJob (jobb, utløser); scheduler.start (); returplanlegger; }

5.2. Vår SchedulerFactoryBean

Vårens SchedulerFactoryBean gir bruk i bønnestil for konfigurering av a Planlegger, administrerer livssyklusen innenfor applikasjonssammenheng, og avslører Planlegger som en bønne for avhengighetsinjeksjon:

@Bean public SchedulerFactoryBean scheduler (Trigger trigger, JobDetail job, DataSource quartzDataSource) {SchedulerFactoryBean schedulerFactory = new SchedulerFactoryBean (); schedulerFactory.setConfigLocation (ny ClassPathResource ("kvarts. eiendommer")); schedulerFactory.setJobFactory (springBeanJobFactory ()); schedulerFactory.setJobDetails (jobb); schedulerFactory.setTriggers (trigger); schedulerFactory.setDataSource (kvartsDataSource); retur planleggerFabrikk; }

5.3. Konfigurerer SpringBeanJobFactory

De SpringBeanJobFactory gir støtte for å injisere planleggerkonteksten, jobbdatakartet og utløse dataoppføringer som egenskaper i jobbbønnen mens du oppretter en forekomst.

Det mangler imidlertid støtte for å injisere bønnehenvisninger fra applikasjonskontekst. Takket være forfatteren av dette blogginnlegget kan vi legge til automatisk kabling støtte til SpringBeanJobFactory som så:

@Bean public SpringBeanJobFactory springBeanJobFactory () {AutoWiringSpringBeanJobFactory jobFactory = ny AutoWiringSpringBeanJobFactory (); jobFactory.setApplicationContext (applicationContext); retur jobbFabrikk; }

6. Konklusjon

Det er alt. Vi har nettopp bygd vår første grunnleggende planlegger ved hjelp av Quartz API, så vel som Spring's bekvemmelighetsklasser.

Hovedtaket fra denne opplæringen er at vi klarte å konfigurere en jobb med bare noen få kodelinjer og uten å bruke noen XML-basert konfigurasjon.

Det komplette kildekode for eksemplet er tilgjengelig i dette github-prosjektet. Det er et Maven-prosjekt som kan importeres og kjøres som det er. Standardinnstillingen bruker Spring's komfortklasser, som enkelt kan byttes til Quartz API med en kjøretidsparameter (se README.md i depotet).


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