티스토리 뷰

IT/Framework

Struts2 + Quartz2 scheduler 예제

Normal_One 2017. 11. 4. 16:47

 월급쟁이인 관계로 설렁설렁 일을 하고 있던 와중에 스트럿츠2를 프레임워크로 사용하고 있는 시스템에서 scheduler를 생성할 일이 생겼습니다. Spring 프레임워크 기반이 아니라서 Spring에서 처럼 간단하게 어노테이션으로 처리할 수 없어서 열심히 구글에서 검색을 해봤습니다. 검색을 해보니 Quartz2라는 라이브러리를 통해서 만들라고 하더군요. 그래서 Quartz2를 기반으로 한 scheduler를 만들어 냈습니다. 생각보다 간단했습니다. 일단 Struts2는 기본적으로 있으실거라고 생각하고 Quartz2 라이브러리부터 받아보도록 하겠습니다.


1
2
3
4
5
6
<!-- Quartz framework -->
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.1.5</version>
</dependency>
cs


Maven으로 라이브러리를 관리하고 있으시다면 pom.xml 에 다음과 같이 넣어주시면 되고 Maven을 사용하지 않고 있다면 


http://www.quartz-scheduler.org/downloads/


 위 링크에서 라이브러리를 받은 후 WEB-INF에 있는 라이브러리가 들어가있는 lib 폴더에 넣어주면 됩니다. 그럼 본격적으로 scheduler를 만들어 보도록 하겠습니다.


1
2
3
4
5
6
7
8
9
10
11
package com.studioH.daemon;
 
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
 
public class oneMinuteDaemon implements Job {
    public void execute(JobExecutionContext context) throws JobExecutionException {
        System.out.println("1분에 한번씩 도는 데몬 작성 Test중...");
    }
}
cs


 위와 같이 먼저 실제 로직이 들어갈 부분부터 간단하게 만들었습니다. execute method 안에 실제로 돌아갈 로직을 작성해주면 됩니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
package com.studioH.daemon;
 
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import org.quartz.CronScheduleBuilder;
import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.Trigger;
import org.quartz.TriggerBuilder;
import org.quartz.impl.StdSchedulerFactory;
import com.stuiodH.daemon.oneMinuteDaemon;
 
public class daemonListener implements ServletContextListener {
 
    public void contextDestroyed(ServletContextEvent arg0) {
        //
    }
 
    public void contextInitialized(ServletContextEvent arg0) {
 
        JobDetail job = JobBuilder.newJob(oneMinuteDaemon.class).withIdentity("oneMinuteDaemon""group1").build();
 
        try {
 
            Trigger trigger = TriggerBuilder.newTrigger().withIdentity("oneMinuteDaemon""group1").withSchedule(CronScheduleBuilder.cronSchedule("0 0/1 * * * ?")).build();
 
            Scheduler scheduler = new StdSchedulerFactory().getScheduler();
            scheduler.start();
            scheduler.scheduleJob(job, trigger);
 
        } catch (SchedulerException e) {
            e.printStackTrace();
        }
 
    }
 
}
cs


 위 부분은 ServletContextListener를 상속 받은 클래스로 스트럿츠2가 서버에서 올라갈 때 무조건 먼저 실행하는 역활을 합니다. 이미 ServletContextListener를 상속 받은 클래스가 있다면 거기에 job 및 trigger를 생성해도 무방합니다. 그러면 이제 마지막으로 web.xml에 리스너를 등록해주도록 합시다.


1
2
3
 <listener>
  <listener-class>kr.co.s1.v2.web.daemon.daemonListener</listener-class>
 </listener>
cs


 이미 등록된 리스너에 job 및 trigger를 생성해줬다면 이전에 web.xml에 넣었을테니 따로 넣어줄 필요가 없을것이고 없을때에만 넣어주시면 됩니다. 데몬을 하나 더 만들어야 한다면 로직이 돌아가는 클래스를 하나 더 만든 후에 job과 trigger를 하나 더 만들어준 후 scheduler.scheduleJob으로 실행해주시면 됩니다. Cron 표기에 대한 설명은 별도의 링크로 대체하기로 하겠습니다. 


http://www.quartz-scheduler.org/documentation/quartz-2.2.x/tutorials/tutorial-lesson-06

댓글
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday