Spring Scheduler ile Zamanlandırılmış Görev Uygulaması

Spring
Spring Dersleri

Java uygulamamızı belirli bir zamanda, zamanlandırılmış görev olarak çalıştırma işlemlerinin Spring ile nasıl olduğuna bakacağız. Bir uygulama yapacağız bu uygulama her 10 saniyede bir konsola bir mesaj yazdıracağız.

Maven projesi oluşturalım. Bağımlılığımızı ekleyelim.

<dependencies>
  <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>4.0.2.RELEASE</version>
   </dependency>
</dependencies>

Klasör yapısı yukarıdaki şekildeki gibi olucaktır.

Zamanlandırılmış işlemi yaptıracağımız class’ımızı oluşturacağız. Gorev adında bir class oluşturalım ve yaptığımız adımları açıklayalım.

@Component
public class Gorev {

    private int sayac=0;

    @Scheduled(cron = "*/10 * * * * *")
    public void calistirGorev() {
        sayac++;
        System.out.println("Program Çalıştı : İş Görevi : " +  sayac+" Zaman : " + new Date());
    }
}

Gorev class’ımızı @Component anotasyonunu kullanıyoruz. Bir sayac oluşturduk bu sayacımızı sıfırdan başlatarak calistirGorev() metodunda değerini her çalıştırdığımızda bir arttıracağız. Ve bu değer metod her çalıştığında artmış olucak.

Metodumuzun görevi açıkca belli. Konsol ekranına programın çalıştığı zamanı ve o zamandaki sayaç değerini yazdırıyor. Şimdi metodumuzun istediğimiz zamanda çalışmasını sağlamak için gerek anotasyonu yazıyoruz.

@Scheduled(cron = "*/10 * * * * *")

Zamanlı olarak çalıştırmak istediğimiz metodun üzerine @Scheduled anotasyonu kullanarak bir cron işleminin zamanını belirtiyoruz. Yukarıda yazdığımız zaman işlemi  bu metodun her 10 saniyede bir her gün çalışmasını sağlamaktadır.

Zamanlanmış görevin yazma şekli ise

@Scheduled(cron = "saniye - dakika - saat - ayın günü - ay - ayın haftası")

olmaktadır.

Örnek vermek gerekirse;

"0 0 * * * *" = Hergün her zaman çalışır.
"*/10 * * * * *" = Hergün 10 saniyede bir çalışır.
"0 0 8-10 * * *" = Hergün 8, 9 ve 10 saatinde çalışır.
"0 0/30 8-10 * * *" = Hergün 8:00, 8:30, 9:00, 9:30 ve 10 saatinde çalışır.
"0 0 9-17 * * MON-FRI" = Her zaman Pazartesiden Cumaya kadar saat 9 ile 17 saatleri arasında çalışır.

şeklinde olmaktadır.

Spring Scheduled ve Cron işleminin nasıl yapıldığını açıklamaya çalıştım. Şimdi ise springContext.xml adında bir konfigürasyon dosyası oluşturacağız.

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:beans="http://www.springframework.org/schema/beans"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:task="http://www.springframework.org/schema/task"
       xsi:schemaLocation="
    http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context.xsd
    http://www.springframework.org/schema/task
    http://www.springframework.org/schema/task/spring-task.xsd">

    <task:annotation-driven scheduler="scheduler"/>
    <task:scheduler id="scheduler" pool-size="5"/>

    <context:component-scan base-package="com.burakkutbay"/>
</beans>

Spring konfigürasyon dosyamızda <task:scheduler /> propertysinden bahsedelim. Bu property sayesinde oluşturduğumuz zamanlanmış metodun kaç thread’de çalışacağını söylemiş oluyoruz. Belirtmezsek tek thread’de çalışmaktadır. (Bu işlem asenkron ile karıştırılmamalıdır.)

Diğer bir property ise <context:component-scan/> propertysidir. Bu property ise sıkça kullandığımız Spring Anotasyonların tanınacağı paketi gösteriyoruz. Spring konfigürasyonumuz bitti. Şimdi sıra geldi programımızın çalışmasını sağlacak Main.classımızda  bu class bizim programımızı çalıştırmayı ve devamlı olarak açık kalmasını sağlaycak.

public class Main {

    public static void main(String[] args) {
        ApplicationContext applicationContext=new ClassPathXmlApplicationContext("springContext.xml");
    }
}

Main classımızda bir spring projesini ayağa kaldırmak için gerekli olan ApplicationContext’ten bir instance yaratıp kendi konfigürasyon dosyamızı tanıtıp ona göre çalışmasını sağlamaktayız.

Projemizi şimdi çalıştıralım ve çıktısına bakalım.  Sonuç olarak her 10 saniyede bir konsola bir çıktı üretiyor.

Çıktı :

Program Çalıştı : İş Görevi : 1 Zaman : Mon Mar 20 14:42:30 EET 2017
Program Çalıştı : İş Görevi : 2 Zaman : Mon Mar 20 14:42:40 EET 2017
Program Çalıştı : İş Görevi : 3 Zaman : Mon Mar 20 14:42:50 EET 2017
Program Çalıştı : İş Görevi : 4 Zaman : Mon Mar 20 14:43:00 EET 2017
Program Çalıştı : İş Görevi : 5 Zaman : Mon Mar 20 14:43:10 EET 2017
Program Çalıştı : İş Görevi : 6 Zaman : Mon Mar 20 14:43:20 EET 2017
Program Çalıştı : İş Görevi : 7 Zaman : Mon Mar 20 14:43:30 EET 2017


Projenin Kaynak Kodlarını Github Üzerinden Görünlüte 

Leave a Reply

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Burak KUTBAY 2010 - 2019
%d blogcu bunu beğendi: