Zakazivanje u proljeće s kvarcom

1. Pregled

U ovom uputstvu ćemo izgraditi jednostavan Planer u proljeće s kvarcom.

Počet ćemo s jednostavnim ciljem na umu - lako konfigurirati novi planirani posao.

1.1. Ključne komponente kvarcnog API-ja

Kvarc ima modularnu arhitekturu. Sastoji se od nekoliko osnovnih komponenata koje se prema potrebi mogu kombinirati. U ovom uputstvu usredotočit ćemo se na one koji su zajednički svakom poslu: Posao, Pojedinosti o poslu, Okidač iPlaner.

Iako ćemo koristiti Spring za upravljanje aplikacijom, svaka se pojedinačna komponenta može konfigurirati na dva načina: Kvarcni način ili Proljeće način (koristeći svoje praktične klase).

Radi cjelovitosti pokrivat ćemo oba, koliko god je to moguće, ali bilo koji od njih može se usvojiti. Počnimo graditi, jednu po jednu komponentu.

2. Posao i Pojedinosti o poslu

2.1. Posao

API pruža a Posao sučelje koje ima samo jednu metodu - izvršiti. To mora provesti klasa koja sadrži stvarni posao koji treba obaviti, tj. Zadatak. Kad se okidač posla aktivira, planer poziva oznaku izvršiti metoda, prosljeđujući je a JobExecutionContext objekt.

The JobExecutionContext pruža instancu posla informacije o svom runtime okruženju, uključujući ručicu planeru, ručicu okidača i posao Pojedinosti o poslu objekt.

U ovom brzom primjeru - posao delegira zadatak u uslužnu klasu:

@Component javna klasa SampleJob implementira posao {@Autowired private SampleJobService jobService; javno void izvršenje (JobExecutionContext context) baca JobExecutionException {jobService.executeSampleJob (); }} 

2.2. Pojedinosti o poslu

Iako je posao radni konj, Quartz ne pohranjuje stvarnu instancu klase posla. Umjesto toga, možemo definirati instancu Posao koristiti Pojedinosti o poslu razred. Razred posla mora biti osiguran od strane Pojedinosti o poslu tako da zna tip posla koji treba izvršiti.

2.3. Kvarcni JobBuilder

Kvarc JobBuilder pruža API za izgradnju u stilu graditelja Pojedinosti o poslu entiteta.

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

2.4. Proljeće JobDetailFactoryBean

Proljetni JobDetailFactoryBean pruža upotrebu graha u obliku za konfiguriranje Pojedinosti o poslu instance. Kao naziv posla koristi naziv graha proljeća, ako nije drugačije naznačeno:

@Bean public JobDetailFactoryBean jobDetail () {JobDetailFactoryBean jobDetailFactory = new JobDetailFactoryBean (); jobDetailFactory.setJobClass (SampleJob.class); jobDetailFactory.setDescription ("Pozovite uslugu uzorka posla ..."); jobDetailFactory.setDurability (true); vratiti posaoDetailFactory; }

Nova instanca Pojedinosti o poslu kreira se za svako izvršavanje posla. The Pojedinosti o poslu objekt prenosi detaljna svojstva posla. Nakon završetka izvršenja, reference na instancu se ispuštaju.

3. Okidač

A Okidač je mehanizam za raspored a Posao, tj. a Okidač instanca "otpušta" izvršenje posla. Postoji jasna podjela odgovornosti između Posao (pojam zadatka) i Okidač (mehanizam rasporeda).

Pored Posao, okidač također treba a tip koji se mogu odabrati na temelju zahtjeva za raspoređivanje.

Recimo, želimo zakazati izvršenje zadatka jednom na sat, unedogled - možemo koristiti Quartzov TriggerBuilder ili proljetne SimpleTriggerFactoryBean učiniti tako.

3.1. Kvarcni TriggerBuilder

TriggerBuilder je API u izgradnji za izgradnju Okidač entitet:

@Bean javni okidač okidača (JobDetail posao) {return TriggerBuilder.newTrigger (). ForJob (job) .withIdentity ("Qrtz_Trigger") .withDescription ("Sample trigger") .withSchedule (simpleSchedule (). RepeatForever (). WithIntervalInH )) .build (); }

3.2. Proljeće SimpleTriggerFactoryBean

SimpleTriggerFactoryBean pruža upotrebu graha u obliku za konfiguriranje SimpleTrigger. Kao naziv okidača koristi naziv zrna proljeća i zadane vrijednosti za neodređeno ponavljanje, ako nije drugačije naznačeno:

@Bean javni okidač SimpleTriggerFactoryBean (posao JobDetail) {Okidač SimpleTriggerFactoryBean = novi SimpleTriggerFactoryBean (); trigger.setJobDetail (posao); okidač.setRepeatInterval (3600000); okidač.setRepeatCount (SimpleTrigger.REPEAT_INDEFINITELY); povratni okidač; }

4. Konfiguriranje JobStore

JobStore pruža mehanizam za pohranu za Posao i Okidač, i odgovoran je za održavanje svih podataka bitnih za rokovnik poslova. API podržava oboje u sjećanju i uporan trgovinama.

4.1. U sjećanju JobStore

Na primjer, koristit ćemo memoriju RAMJobStore koji nudi brze performanse i jednostavnu konfiguraciju putem kvarc.svojstva:

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

Očiti nedostatak RAMJobStore je da je to hlapljiv u prirodi. Sve informacije o rasporedu gube se između isključenja. Ako se definicije poslova i rasporedi moraju držati između isključenja, ustrajni JDBCJobStore mora se koristiti umjesto toga.

Da biste omogućili memoriju JobStore u proljeće, postavili smo ovo svojstvo u naš primjena.svojstva:

spring.quartz.job-store-type = memory

4.2. JDBC JobStore

Postoje dvije vrste JDBCJobStore: JobStoreTX i JobStoreCMT. Oboje rade isti posao spremanja podataka o rasporedu u bazu podataka.

Razlika između njih dvojice je u načinu na koji upravljaju transakcijama koje obvezuju podatke. The JobStoreCMT vrsta zahtijeva aplikacijsku transakciju za pohranu podataka, dok JobStoreTX type započinje i upravlja vlastitim transakcijama.

Postoji nekoliko svojstava za a JDBCJobStore. Kao minimum moramo navesti vrstu JDBCJobStore, izvor podataka i klasa upravljačkog programa baze podataka. Postoje klase upravljačkih programa za većinu baza podataka, ali StdJDBCDelegate pokriva većinu slučajeva:

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

Postavljanje JDBC-a JobStore u proljeće traje nekoliko koraka. Prvo, vrstu trgovine postavljamo u našu primjena.svojstva:

proljeće.kvarc.job-store-type = jdbc

Dalje, trebamo omogućiti automatsku konfiguraciju i Springu dati izvor podataka potreban kvarcnom planeru. The @QuartzDataSource anotacija za nas obavlja težak posao u konfiguriranju i inicijalizaciji baze podataka Quartz:

@Configuration @EnableAutoConfiguration javna klasa SpringQrtzScheduler {@Bean @QuartzDataSource javni DataSource quartzDataSource () {return DataSourceBuilder.create (). Build (); }}

5. Planer

The Planer sučelje je glavni API za povezivanje s planerom poslova.

A Planer može se instancirati s PlanerFactory. Jednom stvoreno, Posaos i Okidačmogu se registrirati s njim. U početku je Planer je u "stanju pripravnosti" i njegov početak mora se pozvati metoda za pokretanje niti koje pokreću izvršavanje poslova.

5.1. Kvarcni StdSchedulerFactory

Jednostavnim pozivanjem na getScheduler metoda na StdSchedulerFactory, možemo instancirati Planer, inicijalizirajte ga (s konfiguriranim JobStore i ThreadPool) i vratite ručicu svom API-ju:

@Bean javni planer planera (okidač okidača, posao JobDetail, tvornica SchedulerFactoryBean) baca SchedulerException {Planer planera = factory.getScheduler (); planer.scheduleJob (posao, okidač); planer.start (); planer povrata; }

5.2. Proljeće SchedulerFactoryBean

Proljetni SchedulerFactoryBean pruža upotrebu zrna graha za konfiguriranje a Planer, upravlja svojim životnim ciklusom unutar konteksta aplikacije i izlaže Planer kao grah za injekciju ovisnosti:

@Bean javni raspored planeraFactoryBean (okidač okidača, posao JobDetail, DataSource quartzDataSource) {SchedulerFactoryBean schedulerFactory = novi SchedulerFactoryBean (); schedulerFactory.setConfigLocation (novi ClassPathResource ("quartz.properties")); schedulerFactory.setJobFactory (springBeanJobFactory ()); schedulerFactory.setJobDetails (posao); schedulerFactory.setTriggers (okidač); schedulerFactory.setDataSource (quartzDataSource); povratnik planeraFactory; }

5.3. Konfiguriranje SpringBeanJobFactory

The SpringBeanJobFactory pruža podršku za ubrizgavanje konteksta planera, mape podataka posla i okidača unosa podataka kao svojstava u grah posla tijekom stvaranja instance.

Međutim, nedostaje podrška za ubrizgavanje referenci na grah iz kontekst aplikacije. Zahvaljujući autoru ovog posta na blogu, možemo dodati automatsko ožičenje podrška za SpringBeanJobFactory ovako:

@Bean public SpringBeanJobFactory springBeanJobFactory () {AutoWiringSpringBeanJobFactory jobFactory = novo AutoWiringSpringBeanJobFactory (); jobFactory.setApplicationContext (applicationContext); povratak jobFactory; }

6. Zaključak

To je sve. Upravo smo izgradili svoj prvi osnovni planer koristeći Quartz API kao i Springove klase praktičnosti.

Ključni potez ovog vodiča je taj što smo posao mogli konfigurirati sa samo nekoliko redaka koda i bez upotrebe bilo kakve konfiguracije temeljene na XML-u.

Kompletna izvorni kod primjer je dostupan u ovom github projektu. Riječ je o projektu Maven koji se može uvesti i pokrenuti kakav jest. Zadana postavka koristi Springove praktične klase, koje se lako mogu prebaciti na Quartz API s parametrom vremena izvođenja (pogledajte README.md u spremištu).