Yazar girişi yapmak için tıklayın
ozgurclub banner

Job ve Cron Expression

Merhaba arkadaşlar.Sizlere Eclips IDE kullanarak Job nasıl oluşturulur anlatmaya çalışacağım.

Job kullanan projelerinizde kullanmak için öncelikle Quartz kütüphanesini indirmeniz gerekiyor.Buradan indirebilirsiniz.Zip dosyasını indirdikten sonra bir yere açın.İçindeki 'quartz-1.6.6.jar' kütüphanesi bizim işimize görecek jar dosyası.

Daha sonra Biz dinamik web projesi oluşturun.(Ben Eclips IDE kullanmaktayım)Ve bu projenin Webcontent->WEB-INF->lib kısmına quartz-1.6.6.jar kütüphanesini ve indirdiğimiz klasörde yer alan lib->core altındaki
commons-logging-1.1.jar kopyalayın.
Projemiz oluşturacağımız job sınıfları için uygun hale geldi.

Joblar sistem ilk ayağa kalktığı zaman çalışmaya başlarlar.bu nedenle bizim bunu sağlamak için bir starter servleti yazmamız gerekiyor.bu servlette çalışacak jobun tüm özelliklerini tanımlayacağız.Bunun için com.sondefterim.job ismini verdiğim paketin altına HttpServlet sınıfından türeyen JobStarterServlet sınıfını oluşturdum.

JobStarterServlet sınıfının init methoduna bizim için gerekli olan SchedulerFactory ve Scheduler sınıflarından birer değişken tanımladım.


public class JobStarterServlet extends HttpServlet {
    public void init(ServletConfig config) throws ServletException {


       SchedulerFactory sf = new StdSchedulerFactory();
       Scheduler sched =  sf.getScheduler();


jobumuzun bir id si ve calışacağı zamanı bildiren bir cron exp dediğimiz değişkenlere ihtiyacımız var.

String jobId="500"; // tek job oluştıracağımız için id önemli değil.
String cronExp="* * * * * ? *"; //Her saniye çalışan bir job tanımlamak için kullanılılan cron exp.ilerleyen yerlerde daha geniş anlatmaya çalışacağım.
Kullanacağımız sınıfı da oluşturalım.

JobDetail job=new JobDetail("job1", "group1", MyJob.class);  

job1:jobumuzun ismi,
group1: grup adı,
MyJob.class: jobun çalıştığınıda işleyeceği sınıf.(MyJob sınıfımızı da Job sınıfından Türeterek oluşturabiliriz.)
bundan sonra bir de CronTrigger tanımlamamız gerekiyor.

CronTrigger trigger = new CronTrigger("trigger1", "group1", "job1","group1", cronExp);


trigger1:CronTrigger in ismi,
group1:trigger in grup adı,
job1:job adı,
group1:jobun grubunun adı.
(Buradan şu çıkıyor. birden falza job grubu veya trigger oluşturabiliriz. ve de her gruba birden fazla job oluşturabiliriz.
Biz şu anda sadece bir grupta bir job oluşturuyoruz.Genelde joblar veritabanında tanımlanır.bu isimler gruplar veritabanına kayıt eklemek suretiyle çoğaltılırlar ve startup servletlerde çoklu job oluşturmak üzere ayarlanırlar.)

ve jobumuzu crontrigger ile programlıyoruz:

sched.scheduleJob(job, trigger);

ve son olarak

sched.start();

     }

}


diyerek jobu ayağa kaldırmış oluyoruz.

tüm bu kodları try-catch blokları arasında yazarsak herhangi bir hatayı ekranda görüntüleyebiliriz.
gönderilebilecek hatalar:
SchedulerException ve ParseException.

Bundan sonra sıra jobun her çalıştığında yapacaklarını belirlemeye geldi.bunun için Job sınıfından türeyen bir MyJob sınıfı oluşturuyoruz. ve 'execute' methodundan yapılacakları belirliyoruz.

    public void execute(JobExecutionContext context) throws JobExecutionException {
           System.out.println("Job Calisma Raporu.Saat:"+new Date());                                 
    }


son olarak starter servletimizi web.xml dosyasında gösteriyoruz.

  <servlet>
    <servlet-name>QuartzInitializer</servlet-name>
    <servlet-class>org.quartz.ee.servlet.QuartzInitializerServlet</servlet-class>
    <load-on-startup>200</load-on-startup>
  </servlet>
 
  <servlet>
    <servlet-name>JobStarterServlet</servlet-name>   
    <servlet-class>com.sondefterim.job.JobStarterServlet</servlet-class>
    <load-on-startup>240</load-on-startup>
  </servlet>


artık job hazır.serveri start ettiğimizde çalışma raporları yazılması gerekiyor.

Cron Expression


Jobun ne zaman çalışmasını ayarlamak için cronExp. tanımlamak gerektiğini söylemiştik.
ve her saniye çalışan cronexp tanımlamıştık.cron exp tanımlamak için aralarında boşluk bırakarak:
saniye,dakika,saat, gün,ay,haftanın günü ve yıl
şeklinde yazılmalıdır.
saniye alanına 0-59 arası,
dakika alanına 0-59 arası,
saat alanına 0-23 arası,
gün alanına (artık yıl ve ay olma durumuna göre) 1-31 arası ,
ay alanına 1-12 veya ingilizce olarak ay isminin ilk üç karekteri(JAN,FEB,JUL,AGU...),
haftanın günü alanına 1-7 arası(pazar=1,pazartesi=2...cumartesi=7) veya ingilizce gün adının ilk üç karakteri(WED,SUN,FRI ...),
yıl alanı girilmeyebilir.Bu durumda tüm yıllar için işlenecektir.

Bunların yanında özel karakterle sınırlama veya çeşitlendirme yapılabilir.Bu karakterler:
    '*': tamamamı için geçerli anlamına gelir.hatırlarsanız bizim örnekte yaptığımız cronexp '* * * * * ? *' şeklindeydi.


    '?':genelde haftanın günü alanı için kullanılır.'önemseme' anlamındadır.örneğin verdiğimiz bir gün için işlenecekken haftanın kaçıncı günü olmasının önemi yok demektir.


    '-': bu işaret ise aralık vermek için kullanılır.mesela saat 2 ile 5 arasında çalışsın şeklinde ayarlamak istiyorsak saat alanına 2-5 yazabiliriz.


    ',': sadece verilen değerleri için işlenir.örneğin her saatin 15. ve 45. dakikalarında işlenmesini istediğimiz bir cron exp için dakika alınına 15,45 yazabiliriz. ',' işareti ile ayırıp istediğimiz kadar sayı yazabiliriz. 1,2,3,4,5,6,7,16,48 gibi


    '/': iki rakan arasında takrarlamak için kullanılır.örneğin saniye alanında 0/10 yazılırsa,tarihde saniye 0 olduğu zaman ve her 10 un katlarına gelindiğinde

işlenir. '2/9' kullanılırsa 2. dakika,11.dakika,20. dakika ,29. dakika şeklinde gider.
     'L': Last anlamındadır. yazıldığı alanın son sayısına gelindiğinde işlenir. Gün ,ay ve haftanın günü alanlarında kullanılır.Gün alanına yazılırsa;ağustos ayında
31.Gün,Eylül ayında 30.gün,Şubat ayında ise artık yıl olma durumuna güre 28 veya 29.günde işlenir.,ay alanına yazıldığında aralık ayında,haftanın günü alanına yazlırsa haftanına son günü kabul edilen cumartesi(7) işlenir.ancak sayıyla yazıldığında (1L) belirtilen günü için geçerlidir.mesela (1L) ayın son pazar günü anlamındadır.


    'W': sadece haftanın günü alanı için kullanılır.hafta içi günde anlamındadır.'5W' şeklinde kullanılırsa ayın 5.iş günü anlamına gelir.'LW' şeklinde de kombine

edilebilir.ayın son iş günü anlamına gelir.
    '#':haftaların numaralanması için kullanılır.örneğin '2#1' şeklinde kullanım 2.gün yanı pazartesi,ayın birinci haftasının pazartesi günü anlamına gelir.YAni anneler günü için '.... MAY 1#2' şeklinde yazmamız gerekir.yani mayıs ayının ikinci pazar günü.


Harfle yazılan karakterler büyük ya da küçük yazılmaları bir şey değiştirmez.JUL ile jul aynıdır.

Umarım yazım yararlı olmuştur.Görüşlerini yada varsa düzeltmelerinizi bekliyorum.İyi Çalışmalar.
war dosyasını buradan indirebilirsiniz.

Kaynak:
http://www.quartz-scheduler.org/docs/tutorials/crontrigger.html


Kategori : Java EE
Etiketler : Java ,Job ,Quartz ,Cron Expression ,
Tarih : 19.02.2010
Ekleyen : yildreams
Yorumu Yazan (anonim@ozgurdemirel)
teşekkür ederiz serdar gerçekten 10 numara yazı :)
Yorumu Yazan (anonim@zxfds )
çalıştırdım. çok faydalı oldu.teşekkür ederim
Yorumu Yazan (anonim@ozgur)
bunun .net için olan versiyonu da var....

Tasarım ve Kodlama && SonDefterim.com Sürüm 1.1