Ü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: 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 A kvarc JobBuilder készítő stílusú API-t biztosít a kivitelezéshez JobDetail entitások. 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: Ú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. 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. TriggerBuilder egy építő stílusú API az Trigger entitás: 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: 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. 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: 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: 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: 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: 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: 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. 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: 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: 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: 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).@ Component public class SampleJob Job {@Autowired private SampleJobService jobService; public void execute (JobExecutionContext context) dobja a JobExecutionException {jobService.executeSampleJob (); }}
2.2. JobDetail
2.3. Kvarc JobBuilder
@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
@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; }
3. Trigger
3.1. Kvarc TriggerBuilder
@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
@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
4.1. Emlékül JobStore
org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore
tavasz.kvarc.job-bolt-típus = memória
4.2. JDBC JobStore
org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.StdJDBCDelegate org.quartz.jobStore.dataSource =
spring.quartz.job-store-type = jdbc
@Configuration @EnableAutoConfiguration public class SpringQrtzScheduler {@Bean @QuartzDataSource public DataSource quartzDataSource () {return DataSourceBuilder.create (). Build (); }}
5. Ütemező
5.1. Kvarc StdSchedulerFactory
@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
@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
@Bean public SpringBeanJobFactory springBeanJobFactory () {AutoWiringSpringBeanJobFactory jobFactory = új AutoWiringSpringBeanJobFactory (); jobFactory.setApplicationContext (applicationContext); return jobFactory; }
6. Következtetés