Ütemezés tavasszal a kvarccal

1. Áttekintés

Ebben az oktatóanyagban felépítünk egy egyszerűt Ütemező tavasszal a kvarccal.

Kezdjük egy egyszerű cél szem előtt tartásával - egy új ütemezett munka egyszerű konfigurálásával.

1.1. A Quartz API legfontosabb összetevői

A kvarc moduláris felépítésű. Számos alapkomponensből áll, amelyek szükség szerint kombinálhatók. Ebben az oktatóanyagban azokra összpontosítunk, amelyek minden munkában közösek: Munka, JobDetail, Trigger ésÜtemező.

Bár a Spring-et fogjuk használni az alkalmazás kezeléséhez, minden egyes komponens kétféleképpen konfigurálható: a Kvarc módon vagy a Tavaszi módon (a kényelmi osztályainak felhasználásával).

A teljesség kedvéért a lehető legnagyobb mértékben lefedjük mindkettőt, de bármelyik elfogadásra kerülhet. Kezdjük el építkezni, egy-egy alkatrészt.

2. Munka és JobDetail

2.1. Munka

Az API biztosítja a Munka csak egyetlen módszerrel rendelkező interfész - kivégezni. Az osztálynak végre kell hajtania, amely tartalmazza a tényleges elvégzendő munkát, vagyis a feladatot. Amikor a feladat indítója elindul, az ütemező meghívja a végrehajtani módszer, átadva a JobExecutionContext tárgy.

A JobExecutionContext információt nyújt a munkapéldánynak a futási környezetéről, ideértve az ütemező fogantyúját, az indító fogantyúját és a job JobDetail tárgy.

Ebben a gyors példában - a feladat egy szolgáltatási osztályra delegálja a feladatot:

@ Component public class SampleJob Job {@Autowired private SampleJobService jobService; public void execute (JobExecutionContext context) dobja a JobExecutionException {jobService.executeSampleJob (); }} 

2.2. JobDetail

Míg a munka a munkagép, a Quartz nem tárolja a munkakör aktuális példányát. Ehelyett meghatározhatjuk a Munka használni a JobDetail osztály. A munka osztályát biztosítani kell a JobDetail hogy tudja a típus az elvégzendő feladat

2.3. Kvarc JobBuilder

A kvarc JobBuilder készítő stílusú API-t biztosít a kivitelezéshez JobDetail entitások.

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

2.4. Tavaszi JobDetailFactoryBean

Tavaszi JobDetailFactoryBean bab-stílusú használatot biztosít a konfiguráláshoz JobDetail példányok. Munka névként a tavaszi bab nevet használja, ha másképp nincs meghatározva:

@Bean public JobDetailFactoryBean jobDetail () {JobDetailFactoryBean jobDetailFactory = new JobDetailFactoryBean (); jobDetailFactory.setJobClass (SampleJob.class); jobDetailFactory.setDescription ("Mintafeladat-szolgáltatás meghívása ..."); jobDetailFactory.setDurability (true); return jobDetailFactory; }

Új példánya JobDetail a munka minden végrehajtásához létrejön. A JobDetail objektum közvetíti a munka részletes tulajdonságait. A végrehajtás befejezése után a példányra történő hivatkozások elvetődnek.

3. Trigger

A Trigger az a ütemezés mechanizmusa Munkaazaz a Trigger példány „kirúgja” egy munka végrehajtását. A felelősség egyértelműen el van különítve a Munka (a feladat fogalma) és Trigger (ütemezési mechanizmus).

Továbbá Munka, a ravaszt is szükség van a típus amelyet az ütemezési követelmények alapján lehet megválasztani.

Mondjuk, be akarjuk ütemezni a feladatunk végrehajtását óránként egyszer, a végtelenségig - használhatjuk a Kvarcot TriggerBuilder vagy a tavaszi SimpleTriggerFactoryBean hogy ezt tegye.

3.1. Kvarc TriggerBuilder

TriggerBuilder egy építő stílusú API az Trigger entitás:

@Bean public Trigger trigger (JobDetail job) {return TriggerBuilder.newTrigger (). ForJob (job) .withIdentity ("Qrtz_Trigger") .withDescription ("Sample trigger") .Schedule (simpleSchedule (). RepeatForever () withInterval )) .épít(); }

3.2. Tavaszi SimpleTriggerFactoryBean

SimpleTriggerFactoryBean bab-stílusú használatot biztosít a konfiguráláshoz SimpleTrigger. A tavaszi bab nevet használja kiváltó névként, és alapértelmezés szerint meghatározza az ismétlést, ha másként nincs meghatározva:

@Bean public SimpleTriggerFactoryBean trigger (JobDetail job) {SimpleTriggerFactoryBean trigger = new SimpleTriggerFactoryBean (); trigger.setJobDetail (job); trigger.setRepeatInterval (3600000); trigger.setRepeatCount (SimpleTrigger.REPEAT_INDEFINITELY); visszatérési ravaszt; }

4. A JobStore

JobStore biztosítja a tárolási mechanizmust a Munka és Trigger, és felelős a munkaütemező szempontjából releváns összes adat fenntartásáért. Az API támogatja mindkettőt emlékül és kitartó üzletek.

4.1. Emlékül JobStore

Például az in-memóriát fogjuk használni RAMJobStore amely lángoló gyors teljesítményt és egyszerű konfigurálást kínál kvarc.tulajdonságok:

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

A. Nyilvánvaló hátránya RAMJobStore az, hogy van illó a természetben. A leállítások között minden ütemezési információ elvész. Ha a leállítások között meg kell tartani a munkadefiníciókat és ütemezéseket, akkor a tartós JDBCJobStore helyette kell használni.

A memóriában történő engedélyezéshez JobStore tavasszal, ezt a tulajdonságot a mi alkalmazás.tulajdonságok:

tavasz.kvarc.job-bolt-típus = memória

4.2. JDBC JobStore

Kétféle lehet JDBCJobStore: JobStoreTX és JobStoreCMT. Mindkettő ugyanazt a munkát végzi, amikor az ütemezési információkat tárolja egy adatbázisban.

A kettő között az a különbség, hogy miként kezelik az adatokat lekötő tranzakciókat. A JobStoreCMT típus egy alkalmazás tranzakciót igényel az adatok tárolásához, míg a JobStoreTX type megkezdi és kezeli a saját tranzakcióit.

Számos tulajdonság állítható be az a számára JDBCJobStore. Legalább meg kell adnunk a típusát JDBCJobStore, az adatforrás és az adatbázis-illesztőprogram osztálya. A legtöbb adatbázishoz vannak illesztőprogram-osztályok, de StdJDBCDelegate a legtöbb esetre kiterjed:

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

JDBC felállítása JobStore tavasszal megtesz néhány lépést. Először is beállítottuk az üzlet típusát alkalmazás.tulajdonságok:

spring.quartz.job-store-type = jdbc

Ezután engedélyeznünk kell az automatikus konfigurációt, és meg kell adnunk Springnek a Quartz ütemező számára szükséges adatforrást. A @QuartzDataSource az annotáció kemény munkát végez a Quartz adatbázis konfigurálásában és inicializálásában számunkra:

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

5. Ütemező

A Ütemező az interfész a fő API a munkaütemezővel való kapcsolódáshoz.

A Ütemező példázható a-val SchedulerFactory. Miután létrehozta, Munkas és Triggers regisztrálhatók vele. Kezdetben a Ütemező készenléti üzemmódban van, és annak Rajt metódust kell indítani a munkák végrehajtását indító szálak elindításához.

5.1. Kvarc StdSchedulerFactory

A getScheduler módszer a StdSchedulerFactory, példányosíthatjuk a Ütemező, inicializálja (a konfigurált JobStore és ThreadPool), és adja vissza a fogantyút az API-jához:

@Bean public Scheduler ütemező (Trigger trigger, JobDetail job, SchedulerFactoryBean gyár) dobja SchedulerException {Scheduler ütemező = factory.getScheduler (); scheduler.scheduleJob (munka, trigger); ütemező.start (); visszatérés ütemező; }

5.2. Tavaszi SchedulerFactoryBean

Tavaszi SchedulerFactoryBean bab stílusú használatot biztosít az a konfigurálásához Ütemező, kezeli életciklusát az alkalmazás kontextusában, és kiteszi a Ütemező babként a függőségi injekcióhoz:

@Bean public SchedulerFactoryBean ütemező (Trigger trigger, JobDetail job, DataSource quartzDataSource) {SchedulerFactoryBean schedulerFactory = new SchedulerFactoryBean (); schedulerFactory.setConfigLocation (új ClassPathResource ("quartz.properties")); schedulerFactory.setJobFactory (springBeanJobFactory ()); schedulerFactory.setJobDetails (job); schedulerFactory.setTriggers (trigger); schedulerFactory.setDataSource (quartzDataSource); return schedulerFactory; }

5.3. Konfigurálás SpringBeanJobFactory

A SpringBeanJobFactory támogatást nyújt az ütemező kontextusának, a munkadat-térképnek és az adatbevitelek tulajdonságokba történő beinjekciózásának a munkababba egy példány létrehozása közben.

Hiányzik azonban a bab-referenciák injekciózása a alkalmazás összefüggései. A blogbejegyzés írójának köszönhetõen hozzáadhatjuk automatikus bekötés támogatása SpringBeanJobFactory így:

@Bean public SpringBeanJobFactory springBeanJobFactory () {AutoWiringSpringBeanJobFactory jobFactory = új AutoWiringSpringBeanJobFactory (); jobFactory.setApplicationContext (applicationContext); return jobFactory; }

6. Következtetés

Ez minden. Most építettük meg az első alap ütemezőnket a Quartz API, valamint a Spring kényelmi osztályainak felhasználásával.

Ennek az oktatóanyagnak az a legfontosabb elvonása, hogy csak néhány soros kóddal és XML-alapú konfiguráció nélkül tudtunk konfigurálni egy munkát.

A teljes forráskód a példa ebben a github projektben érhető el. Ez egy Maven projekt, amely importálható és futtatható. Az alapértelmezett beállítás a Spring kényelmi osztályait használja, amelyek futtatási idő paraméterrel könnyen átválthatók Quartz API-ra (lásd a README.md-t a tárban).


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