12 Ekim 2014 Pazar

Spring + Quartz ile zamanlanmış görevler

Merhaba,
bu yazımda sizlere spring ve quartz entegrasyonundan bahsedeceğim. Bir projede belli aralıklarla işlem yapmak isterseniz(SMS gönderme , Mail gönderme, vs ..), bu yapıdan faydalanabilirsiniz. Ben bu projede 10 sn aralıklarla mail gönderme işlemini anlatacağım, kodları inceleyerek zamanlanmış görevler hakkında bilgi sahibi olabilirsiniz.

Öncelikli olarak intelliJ aracılığıyla bir Spring web projesi oluşturuyoruz.
Proje bittiğinde aşağıdaki yapıda olacaktır:


pom.xml dosyasına quartz dependency tanımlamalarını yaparak hemen başlayalım.

pom.xml
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-tx</artifactId>
            <version>3.1.2.RELEASE</version>
        </dependency>

        <!-- Quartz API -->
        <dependency>
            <groupId>opensymphony</groupId>
            <artifactId>quartz</artifactId>
            <version>1.6.3</version>
        </dependency>

        <dependency>
            <groupId>commons-collections</groupId>
            <artifactId>commons-collections</artifactId>
            <version>3.2.1</version>
        </dependency>

        <dependency>
            <groupId>org.apache.directory.studio</groupId>
            <artifactId>org.apache.commons.logging</artifactId>
            <version>1.1.1</version>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-support</artifactId>
            <version>2.0.6</version>
        </dependency>

Web projesi oluşturduğum için projeye gelen tüm URL leri  index.jsp  sayfasına yönlendirelim. Yönlendirme yapmasak ta quartz çalışacaktır ancak yönlendirme yaparsak projeyi çalıştırdığımız bir karşılama sayfası olur ve sayfa bulunamadı hatası almayız.
HelloController .java
@Controller
@RequestMapping("/")
public class HelloController {
                @RequestMapping(method = RequestMethod.GET)
                public String printWelcome(ModelMap model) {
                               model.addAttribute("message", "Hello world!");
                               return "hello";
                }
}

scheduler için xml dosyası aracılığıyla MailReportServiceImpl .java dosyasındaki mailSend metotunu çağıracağız. Dolayısıyla bu class ve metodu hemen oluşturalım.

 MailReportServiceImpl .java
package com.company.service.impl;

import com.company.service.MailReportService;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;

/**
 * Created by levent.yildiz on 12.10.2014.
 */
public class MailReportServiceImpl implements MailReportService {
    @Override
    public void mailSend() {

        DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Calendar calendar = Calendar.getInstance();
        String strDate = dateFormat.format(calendar.getTime());

        //TODO : development
        //Mail gönderme işlemi burada yapılacak
        System.out.println("Mail Gonderiliyor.." + strDate);
    }
}



Ve son aşamada quartz ayarlarını bir xml dosyasından yapıyoruz.
MailReportServiceImpl , MethodInvokingJobDetailFactoryBean(Quartz) ve SimpleTriggerBean(Quartz) metotlarını çağıran bean ler oluşturuyoruz.

MethodInvokingJobDetailFactoryBean metodunu çağırırken kendi yazdığımız MailReportServiceImpl  classını ve mailSend metodunu refere ediyoruz.

Birde son olarak SimpleTriggerBean metoduna bu job'un ne sıklıkla çalışması gerektiğini set ediyoruz.

<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:p="http://www.springframework.org/schema/p" xmlns="http://www.springframework.org/schema/beans"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
                http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">


    <!-- Beans -->
    <bean id="mail"
          class="com.company.service.impl.MailReportServiceImpl"/>


    <bean id="methodJobDetailBean"
          class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"
          p:concurrent="false" p:targetObject-ref="mail" p:targetMethod="mailSend"/>


    <!-- For Testing -->
    <bean id="simpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean"
          p:jobDetail-ref="methodJobDetailBean" p:startDelay="20000"
          p:repeatInterval="10000"/>


    <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean"
          p:waitForJobsToCompleteOnShutdown="true">
        <property name="triggers">
            <list>
                <ref bean="simpleTrigger"/>
            </list>
        </property>
    </bean>
  
</beans>


projenin çıktısı aşağıdaki gibi olacaktır:


kaynak dosyalar(github) : indirmek için tıklayın

Hiç yorum yok:

Yorum Gönderme