11.5. Quartz

A frissítések automatikus indításához szükséges valamilyen időzítőszolgáltatás. Erre használható a Java EE TimerService szolgáltatása ([28], [29]), viszont ez jelenleg még csak elég korlátozott lehetőségeket nyújt: csupán megadott időben lejáró és megadott intervallumonként ismétlődő időzítők létrehozására van lehetőség. Az EJB 3.1-ben elképzelhető a cron-szerű kifejezésekkel megadható időzítők megjelenése is ([30]).

A jelenlegi EJB3 által nyújtott API-nál sokkal kényelmesebb feladatütemező a Quartz ([31]), amely egyszerűen használható Java SE és Java EE alkalmazásokkal is. Képes a cron‑szerű kifejezéssel megadott ütemezések kezelésére, valamint a feladatok többszálú végrehajtását is lehetővé teszi. Ezen kívül jól skálázható, több ezer aktív időzítő sem jelent problémát számára.

A feladatok futtatásáért felelős szál a webrétegben fut, ezt a QuartzInitializerServlet indítja a web.xml load-on-startup tag-jének segítségével (20. ábra).

<servlet>
	<servlet-name>QuartzInitializer</servlet-name>
	<servlet-class>
		org.quartz.ee.servlet.QuartzInitializerServlet
	</servlet-class>
	<load-on-startup>1</load-on-startup>
</servlet>

20. ábra: A Quartz-ot automatikusan indító web.xml bejegyzés

A Java EE TimerService szolgáltatása is hasonló módon indítható automatikusan a szerverre történő telepítés (deploy) végeztével. A load‑on‑startup tag segítségével indított szervletben az időzítők elindításáért felelős EJB-t kell meghívni. Az elkészült alkalmazásban is szerepel egy ilyen szervlet (TimerStartServlet néven), amely a Quartz időzítőinek elindításáért felelős TimerSessionBean-t hívja.

A Quartz az időzítendő feladatok kezeléséhez két interfészt ad: Job és Trigger. A jobok a végrehajtandó feladatot reprezentálják, míg a triggerek azt határozzák meg, hogy mikor kell egy jobot futtatni. Egy jobhoz több trigger is hozzárendelhető. A jobok közül létezik olyan, amely (megfelelően felparaméterezve) képes EJB-ket hívni, de a hivatalos Quartz kiadásban szereplő EJBInvokerJob jelenleg csak EJB 2.1-et támogat.

Triggerekből is többféle létezik, de természetesen sajátot is írhatunk. A Quartz kiadásban megtalálható a CronTrigger, amely az időzítések cron-szerű megadását teszi lehetővé, valamint a SimpleTrigger, amely a Java EE TimerServices szolgáltatásához hasonló lehetőségeket nyújt.

A Quartz különálló (standalone) alkalmazásként is futtatható (ilyenkor RMI‑n keresztül érhető el és klaszterezhető is). A Quartzot a webrétegben futtatva (egy JVM‑ben az EJB‑réteggel) a jobok a session beanekből egyszerűen ütemezhetőek és megmarad a későbbi skálázás lehetősége is.

Mivel a Quartz a webrétegben fut, ezért az általa indított jobok is itt futnak, így saját kezűleg kell az EJB réteghez kapcsolódni (JNDI feloldás útján, mint a Faces backing beanjeiben, ahol szintén nem használható a dependency injection). Ez megtehető az interneten található EJB3-at hívni képes Job implementációkkal is, de az ehhez szükséges kódot kézzel megírni sem túl bonyolult feladat, valamint a JSF backing beanjeiben megírtak is felhasználhatóak.

További opció a jobok perzisztálása, de ez nem került alkalmazásra, mivel a szükséges időzítők egyszerűen létrehozhatóak (csak a UserURL objektumokon kell egyszer végigiterálni). Nagyobb mennyiségű figyelt weboldalnál viszont szükséges lehet ezzel is foglalkozni, mivel az időzítők indítása már komoly többletterhelést (overhead) jelenthet az alkalmazás újraindítása esetén. A Quartz saját thread poollal rendelkezik több feladat egy időben történő futtatásához, így ezzel az oldalletöltések párhuzamosítása is egyszerűen megoldódott.

Tartalom átvétel