Glavni entitet cron4j-a je planer. Sa it.sauronsoftware.cron4j.Scheduler primerom možete da izvršite zadatke u fiksnim trenucima, tokom cele godine. Planer može izvršiti zadatak jednom u minutu, jednom u pet minuta, petkom u 10:00, 16. februara u 12:30 časova, ali samo ako je subota, i tako dalje.
Upotreba cron4j planera je operacija u četiri koraka:
Uzmite u obzir ovaj jednostavan primer:
import it.sauronsoftware.cron4j.Scheduler; public class Quickstart { public static void main(String[] args) { // Creates a Scheduler instance. Scheduler s = new Scheduler(); // Schedule a once-a-minute task. s.schedule("* * * * *", new Runnable() { public void run() { System.out.println("Another minute ticked away..."); } }); // Starts the scheduler. s.start(); // Will run for ten minutes. try { Thread.sleep(1000L * 60L * 10L); } catch (InterruptedException e) { ; } // Stops the scheduler. s.stop(); } }
Ovaj primer radi deset minuta. Na promenu na svaki minut će odštampati tužnu (ali istinitu) poruku "Još jedan minut je otkucao ..."
Neki drugi ključni koncepti:
UNIX crontab-like pattern je niz podeljen u pet odvojenih delova prostora. Svaki deo je namenjen kao:
Star wildcart karakter je takođe priznat, ukazujući na "svaki minut sata", "na svaki sat u toku dana", "Svaki dan u mesecu", "Svaki mesec u godini" i "svaki dan u nedelji", prema sub-pattern-u u kom se koristi.
Kada je planer počeo, zadatak će biti pokrenut kada pet delova u svom obrascu rasporeda budu tačni u isto vreme.
Paterni rasporeda će biti predstavljeni sa it.sauronsoftware.cron4jSchedulingPattern instancom. Nevažeći obrasci zakazivanja su uzrok it.sauronsoftware.cron4j.InvalidPatternExceptions-a. SchedulingPattern klasa nudi i statički validate(String) metod, koji se može koristiti za proveru niza pre nego što ga koristite kao obrazac zakazivanja.
Neki primeri:
5 ****
Ovaj obrazac prouzrokuje da zadatak bude pokrenut na svakih sat vremena, na početku petog minuta (00:05, 01:05, 02:05, itd).
*****
Ovaj obrazac dovodi zadatak da bude pokrenut svakog minuta.
* 12 ** Mon
Ovaj obrazac dovodi zadatak da bude pokrenut svakog minuta tokom 12 sati ponedeljka.
* 12 16 * Mon (Pon)
Ovaj obrazac dovodi zadatak da bude pokrenut svakog minuta tokom 12 sati u ponedeljak, 16-i, ali samo ako je dan 16. u mesecu.
Svaki pod-obrazac može da sadrži dve ili više vrednosti razdvojene zarezima.
59 11 ** 1,2,3,4,5
Ovaj obrazac dovodi zadatak da bude pokrenut u 11:59 pm u ponedeljak, utorak, sredu, četvrtak i petak.
Vrednosni intervali su definisani korišćenjem znaka minus.
59 11 ** 1-5
Ovaj obrazac je ekvivalentan prethodnom.
Crtica karakter može da se koristi za identifikaciju vrednosti koraka u opsegu. Može se koristiti i u vidu */c i a-b/c. Subpattern je uparen sa svim c vrednostima u opsegu 0, maxvalue ili a-b.
* /5 ****
Ovaj obrazac dovodi zadatak da bude pokrenut na svakih 5 minuta (0:00, 0:05, 0:10, 0:15 i tako dalje).
3-18/5 ****
Ovaj obrazac dovodi zadatak da bude pokrenut na svakih 5 minuta počev od trećeg minuta u satu, do 18. (0:03, 0:08, 0:13 , 0:18, 1:03, 1:08 i tako dalje)
* / 15 9-17 ***
Ovaj obrazac dovodi zadatak da bude pokrenut na svakih 15 minuta između 9 h i 17 h doba dana , (9:00, 9:15, 9:30, 9:45 i tako dalje ... napomena da je poslednje izvršenje u 17:45). Sva sveže
opisana pravila sintakse mogu se koristiti zajedno.
* 12 * 10-16/2 * *
Ovaj obrazac dovodi zadatak da bude pokrenut svakog minuta tokom 12-og sata dana, ali samo ako je dan 10., 12., 14. ili 16. u mesecu.
* 12 1-15,17,20-25 **
Ovaj obrazac dovodi zadatak da bude pokrenut svakog minuta tokom 12-og sata dana, ali dan u mesecu mora da bude između 1. i 15., 20. i 25., ili bar to mora biti 17.
Konačno cron4j vam omogućava da kombinujete više obrazaca zakazivanja u jedan, sa cevnim karakterom:
0 5 *** | 8 *** 10 | 22 17 ***
Ovaj obrazac dovodi zadatak da bude pokrenut svaki dan u 05:00, 10 : 08 i 17:22.
Najjednostavniji način da se izgradi zadatak je da sprovedete poznati java.lang.Runnable interfejs. Kada je zadatak spreman, može se zakazati sa it.sauronsoftware.cron4j.Scheduler. schedule(String, Runnable) metodom.Ovaj metod izbacuje it.sauronsoftware.cron4j.InvalidPatternException kada isporučeni niz znakova ne predstavlja važeći obrazac rasporeda.
Drugi način da se izgradi zadatak je da se produži it.sauronsoftware.cron4j.Task apstraktna klasa, koja je moćnija i dozvolite programeru pristup nekim drugim cron4j funkcijama. Ovo je bolje opisano u " Izgradnja sopstvenog zadatka" - "Building your own task” paragrafu. Instance zadataka mogu biti zakazane u schedule(String, Task) i schedule(SchedulingPattern, Task) metodama.
Metode rasporeda raspoložive u planeru uvek vrate ID korišćen za prepoznavanje i preuzimanje zakazane operacije. Ovaj broj se može kasnije koristiti za reprogramiranje zadatka (menjajući njegov obrazac rasporeda) sa reschedule(String, String) ili reschedule(String, SchedulingPattern) metodama, i da se deschedule-uje zadatak (uklonite zadatak iz planera) sa deschedule(String) metodom.
Isti broj može da se koristi za preuzimanje obrazaca raspoređivanja u vezi sa planiranim zadatkom, sa getSchedulingPattern(String) metodom, ili za preuzimanje samog zadatka, sa getTask(String) metodom.
Sistemski procesi mogu biti lako zakazani korišćenjem ProcessTask klase:
ProcessTask task = new ProcessTask("C:\\Windows\\System32\\notepad.exe"); Scheduler scheduler = new Scheduler(); scheduler.schedule("* * * * *", task); scheduler.start(); // ...
Argumenti za proces se mogu dobiti korišćenjem string niza umesto jedinstvene komande žica:
String[] command = { "C:\\Windows\\System32\\notepad.exe", "C:\\File.txt" }; ProcessTask task = new ProcessTask(command); // ...
Promenljive okruženja za proces mogu da se isporučuju koristeći drugi string niz, čiji elementi moraju biti u IME = VREDNOST obliku:
String[] command = { "C:\\tomcat\\bin\\catalina.bat", "start" }; String[] envs = { "CATALINA_HOME=C:\\tomcat", "JAVA_HOME=C:\\jdks\\jdk5" }; ProcessTask task = new ProcessTask(command, envs); // ...
Podrazumevani radni direktorijum za proces može se menjati koristeći treći parametar u konstruktoru:
String[] command = { "C:\\tomcat\\bin\\catalina.bat", "start" }; String[] envs = { "CATALINA_HOME=C:\\tomcat", "JAVA_HOME=C:\\jdks\\jdk5" }; File directory = "C:\\MyDirectory"; ProcessTask task = new ProcessTask(command, envs, directory); // ...
Ako želite da promenite podrazumevani radni direktorijum, ali nemate nijednu promenljivu okruženja, envs parametar konstruktora može da se podesi na nulu:
ProcessTask task = new ProcessTask(command, null, directory);
Kada je envs nula, proces nasleđuje sve promenljive okruženja sadašnjeg JVM:
Promenljive okruženja i radni direktorijum mogu se podesiti pozivajući setEnvs(String[]) i setDirectory(java.io. File) metode.
Standardni output procesa i standardni kanali grešaka mogu biti preusmereni na datoteke pomoću setStdoutFile(java.io.File) i setStderrFile(java.io.File) metoda:
ProcessTask task = new ProcessTask(command, envs, directory); task.setStdoutFile(new File("out.txt")); task.setStderrFile(new File("err.txt"));
Na sličan način, standardni ulazni kanal može biti pročitan iz postojeće datoteke, pozivanjem setStdinFile(java.io.File) metoda:
ProcessTask task = new ProcessTask(command, envs, directory); task.setStdinFile(new File("in.txt"));
Cron4j planer takođe može zakazati skup procesa iz fajla.
Morate pripremiti fajl, veoma sličan onima koje koristi UNIX crontab, i registrujte ga u Scheduler-u pozivajući scheduleFile(File) metod. Fajl može biti otkazan pozivom descheduleFile(File) metoda. Planirani fajlovi mogu se preuzeti pozivajući getScheduledFiles() metod.
Planirani fajlovi su obrađeni svakog minuta. Planer će pokrenuti svaki proces deklarisan u datoteci čiji zakazivan patern odgovara sadašnjem sistemu vremena.
Sintaksna pravila za zakazivanje cron4j datoteke su prijavljena u " Cron parser" paragrafu.
Java.lang.Runnable objekat je najjednostavniji zadatak mogući, ali da preuzme kontrolu potrebno je da produžite it.sauronsoftware.cron4j.Task klasu. U najjednostavnijoj formi, sprovođenje Runnable ili proširenje Task-a su veoma slični poslovi: dok prvi zahteva run() metod, drugi zahteva primenu execute(TaskExecutionContext). Execute(TaskExecutionContext) metod pruža it.sauronsoftware.cron4j.TaskExecutionContext primer, koji Runnable.run() metod ne daje. Kontekst može da se koristi na sledeći način:
Običan zadatak može biti zakazan, pokrenut odmah ili vraćen od strane kolekcionara zadataka.
Možete da gradite i ubacujete u svoj planer zadataka izvora, kroz API metod zadataka.
Cron4j Planer podržava registraciju jedne ili više it.sauronsoftware.cron4j.TaskCollector instanci, uz addTaskCollector(TaskCollector) metod. Registrovani kolektori mogu se preuzeti sa scheduler getTaskCollectors() metodom.Prethodno registrovan kolektor može da se izvadi iz planera sa removeTaskCollector(TaskCollector) metodom. Kolektori mogu da se dodaju, pitaju ili uklone u svakom trenutku, i kada je sheduler počeo i kada je pokrenut.
Svaki registrovani kolektor zadataka se upita od strane planera jednom u minutu. Planer poziva kolektor getTasks() metod. Implementacija mora da vrati it.sauronsoftware.cron4j.TaskTable instancu. TaskTable je tabela koja povezuje zadatke i obrasce zakazivanja. Planer, kada je tabela preuzeta, će ispitati iskazane stavke, i izvršiti svaki zadatak čiji patern zakazivanja odgovara sadašnjem sistemu vremena.
Običan kolektor može da se koristi da veže planer spoljnim izvorom zadataka , odnosno bazom podataka ili XML fajlom, kojim se može upravljati i menjati u sadržaju i u vreme izvršavanja.
It.sauronsoftware.cron4j.SchedulerListener API se može koristiti za slušanje scheduler događaja.
SchedulerListener interfejs zahteva primenu sledećih metoda:
Vidite " Executors" paragraf za više informacija o radnim izvršiocima.
Kada je vaš SchedulerListener slučaj spreman, možete ga registrovati na Scheduler objektu pozivajući njegov addSchedulerListener(SchedulerListener) metod. Već registrovani slušaoci se mogu ukloniti pozivom removeSchedulerListener(SchedulerListener) metoda. Planer može da vrati bilo kog registrovanog slušaoca, getSchedulerListeners() metodom.
SchedulerListeeners se mogu dodati i ukloniti u svakom trenutku, cak i dok je raspored pokrenut
Planer, nakon što je počeo, i dok radi, može se potražiti, da vrati svoje izvršioce. Izvršilac je sličan nitu. Izvršioci se koriste od strane planera da izvrše zadatke.
Pozivanjem Sheduler.getExecutingTasks () metoda možete dobiti izvršioce koji su trenutno u toku.
Takođe možete dobiti izvršioca kroz SchedulerListener instancu (vidi " Building your own scheduler listener" paragraf).
Svaki izvršilac, predstavljen sa it.sauronsoftware.cron4j.TaskExecutor primerom, stvara drugačije izvršenje zadatka.
Zadatak se može preuzeti sa getTask() metodom.
Stanje izvršioca može da se proveri sa isAlive() : vraća se tačno ako izvršilac trenutno radi.
Ako izvršilac radi, trenutni razgovor može biti zaustavljen dok izvršenje ne bude završeno, pozivajući join() metod.
supportsStatusTracking() metod se vraća tačno ako trenutno izvršavani zadatak podržava praćenje statusa.To znači da je zadatak da komunicira izvršiocu svoj status, predstavljen od strane stringa. Trenutna status poruka može biti vraćena, pozivom executor getStatusMessage() metoda.
supportsCompletenessTracking() metod vraća tačno ako trenutno izvršavani zadatak podržava praćenje celovitosti. To znači da je zadatak da komunicira izvršiocu svoj nivo potpunosti. Sadašnji nivo potpunosti može biti vraćen pozivom executor getCompleteness() metoda.Vraćene vrednosti su od 0 (zadatak je tek počeo i još uvek ništa nije urađeno) i 1 (zadatak završen).
canBePaused() metod vraća tačno ako trenutno izvršavani zadatak podržava pauziranje izvršenja. To znači da izvršenje zadatka može da se pauzira pozivom executor pause() metoda. Pause status izvršitelja može se proveriti sa isPaused() metodom. Pauziran izvršilac može biti nastavljen pozivom njegovog resume() metoda.
canBeStopped() metod se vraća tačan ako trenutno izvršavani zadatak podržava prekid izvršenja. To znači da izvršenje zadatka može da se zaustavi pozivom executor stop() metoda. Interruption status izvršitelja se može proveriti sa isStopped() metodom. Zaustavljeni izvršioci ne mogu da se rezimiraju.
getStartTime() metod vraća vremensku oznaku izveštaja vremena početka izvršioca ili vrednost manju od 0 ako izvršilac još nije počeo.
getScheduler() metod vraća planer koji je vlasnik izvršioca.
getGuid() metod vraća tekstualni GUID za izvršioca.
Izvršioci takođe nude jedan događajem pokrenut API, preko it.sauronsoftware.cron4j.TaskExecutorListener klase. TaskExecutorListener može da se doda TaskExecutor-u sa svojim addTaskExecutorListener(TaskExecutorListener) metodom. Slušaoci mogu da se uklone sa removeTaskExecutorListener(TaskEkecutorListener) metodom,a mogu se preuzeti sa getTaskExecutorListeners() metodom. TaskExecutorListener mora da sprovede sledeće metode:
Ukoliko je planer počeo sa radom, moguće je ručno pokretanje zadatka, bez zakazivanja sa paternom. Metoda je Scheduler. launch(Task). Zadatak će biti odmah pokrenut, a TaskExecutor instaca se vraća pozivaocu. Vraćeni objekat može da se koristi za kontrolu izvršenja zadataka (pogledajte" Executors" paragraf).
Sheduler instance, po defaultu, rade sa default sistemom vremenske zone. Odnosno obrazac rasporeda čija je vrednost 0 2 *** će aktivirati svoj zadatak u 02:00 ujutru po podrazumevanom sistemu vremenske zone. Planeru može da se zahteva da radi u drugoj vremenskoj zoni, koja nije podrazumevani sistem. Pozovite Scheduler. setTimeZone(TimeZone) i Sheduler. getTimeZone() da kontroliše ovu funkciju.
Kada je standardna vremenska zona promenjena, sistemsko trenutno vreme je prilagođeno priloženoj zoni pre nego što je upoređeno sa registrovanim obrascima zakazivanja. Rezultat je da se svaki isporučeni obrazac zakazivanja tretira u skladu sa navedenom vremenskom zonom. Pretpostavimo situaciju:
Planer, pre upoređivanja sistemskog vremena sa paternima, prevodi 10:00 sa GMT +1 na GMT +3. To znači da 10:00 postaje 12:00. A rezultatirano vreme se zatim koristi za planerovo aktiviranje zadataka. Dakle, u datoj konfiguraciji u datom trenutku, svaki zadatak zakazan kao 0 12 *** će biti pogubljen, a svaki 0 10 *** neće.
Java Virtual Machine izlazi kada su jedine teme koje su pokrenute su sve daemon teme. Cron4j Planer može da se konfiguriše da se mreste samo demon teme . Da biste kontrolisali ovu funkciju pozovite Scheduler. setDaemon(boolean) metod. Ovaj metod mora da se pozove pre nego što je planer pokrenut. Default vrednost je lažna (false). Da biste proverili planerov trenutni daemon status pozovite Scheduler. isDaemon() metod.
it.sauronsoftware.cron4j.Predictor klasa je u stanju da predvidi kada će obrazac biti uparen.
Pretpostavimo da želite da znate kada će planer izvršiti zadatak zakazan sa obrascem 0 3 * Jan-Jun, Sep-Dec Mon-Fri. Možete predvideti sledeće izvršenje zadatka pomoću prediktorove instance:
String pattern = "0 3 * jan-jun,sep-dec mon-fri"; Predictor p = new Predictor(pattern); for (int i = 0; i < n; i++) { System.out.println(p.nextMatchingDate()); }
it.sauronsoftware.cron4j.CronParser klasa može da se koristi za analiziranje crontab-like formatiranog fajla kao i tokove karaktera.
Ako želite da zakažete listu zadataka prijavljenih u crontab-nalik datoteci ne treba vam CronParser, jer možete to da uradite tako što ćete dodati fajl u planer, sa Scheduler. scheduleFile(File) metodom.
Razmislite da koristite CronParser ako vam Scheduler.scheduleFile(File) metod nije dovoljan. Na primer, možda ćete morati da donesete listu zadataka sa udaljenog izvora koji nije pretstavljiv kao java.io.File objekat (dokument na udaljenom serveru, DBMS skup rezultata i tako dalje). Da biste rešili problem možete da sprovedete svoj it.sauronsoftware.cron4j.TaskCollector,dobijajući prednost CronParser-a da analizira bilo koji sadržaj nalik crontab-u.
Možete da analizirate ceo fajl / stream, ali takođe možete da raščlanite samo jednu rečenicu.
Red može da bude prazan, može da sadrži komentar, ili to može biti red rasporeda.
Red koji ne sadrži nikakve znakove ili red samo sa karakterima prostora se smatra praznim.
Red čiji je prvi ne-prostor karakter je znak broja (#) se smatra komentarom.
Prazni redovi i redovi komentara se ignorišu od strane parsera.
Bilo kakvi drugi redeovi se analiziraju kao redovi zakazivanja.
Važeći red rasporeda poštuje sledeću strukturu:
scheduling-pattern [options] command [args]
Posle zakazivanja stavke obrasca, drugi tokeni u svakom redu su odvojeni prostor ili razgraničenja sa duplim znacima navoda (").
Navodnici razgraničenih stavki mogu iskoristiti prednost sledećih nizova:
Kolekcija opcija tokena može da sadrži jedan ili više od sledećih elemenata:
Takođe je moguće zakazati pozivanje na metodu Java klase u okviru parser ClassLoder-a. Metod mora da bude statičan i mora da prihvati niz stringova kao jedini argument. Da biste aktivirali ove vrste metoda sintaksa je:
scheduling-pattern java:className#methodName [args]
#methodname deo se može izostaviti:u ovom slučaju main(String []) će biti pretpostavljen.
Napominjemo da se statičke metode pozivaju u okviru scheduler-a istog JVM, bez mrešćenja drugih spoljnih procesa. Tako IN, OUT, ERR, ENV i DIR opcije ne mogu da se primene.
Nevažeći redovi zakazivanja se odbacuju bez blokiranja procedure analize, ali poruka o grešci se šalje na aplikaciju standardnog kanala greške.
Važeći primeri:
0 5 * * * sol.exe 0,30 * * * * OUT:C:\ping.txt ping 10.9.43.55 0,30 4 * * * "OUT:C:\Documents and Settings\Carlo\ping.txt" ping 10.9.43.55 0 3 * * * ENV:JAVA_HOME=C:\jdks\1.4.2_15 DIR:C:\myproject OUT:C:\myproject\build.log C:\myproject\build.bat "Nightly Build" 0 4 * * * java:mypackage.MyClass#startApplication myOption1 myOption2