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.
Legutóbbi hozzászólások
9 év 15 hét
10 év 4 hét
10 év 8 hét
10 év 26 hét
11 év 28 hét
11 év 33 hét
11 év 33 hét
11 év 34 hét
11 év 44 hét
12 év 15 hét