낭만 프로그래머

Web에서 Quartz를 사용하여 스케쥴링 하기 본문

Java/Tomcat

Web에서 Quartz를 사용하여 스케쥴링 하기

조영래 2020. 9. 21. 15:34

Web에서 스케쥴링하기 위해서는 Spring을 사용하는 것이 가장 좋지만 가끔은 Spring을 사용하지 않고 순수하게 JSP/Servelt만을 이용하여 프로젝트를 할 경우가 있다.
때문에 Quartz 라이브러리를 이용하게 간단하게 스케쥴링 해보자.

1. 모든 문서와 예제는 www.quartz-scheduler.org/ 에 가면 있으니 참조 하시기 바랍니다

2. Maven을 사용하여 라이브러리를 다운로드 하세요

<!-- https://mvnrepository.com/artifact/org.quartz-scheduler/quartz -->
<dependency>
	<groupId>org.quartz-scheduler</groupId>
	<artifactId>quartz</artifactId>
	<version>2.3.2</version>
</dependency>

 

3. web.xml 에서 Quartz를 초기화 합니다

<servlet>
	<servlet-name>
		QuartzInitializer
	</servlet-name>
	<display-name>
		Quartz Initializer Servlet
	</display-name>
	<servlet-class>
		org.quartz.ee.servlet.QuartzInitializerServlet
	</servlet-class>
	<load-on-startup>
		1
	</load-on-startup>
	<init-param>
		<param-name>config-file</param-name>
		<param-value>/com/company/scheduler/quartz.properties
		</param-value>
	</init-param>
	<init-param>
		<param-name>shutdown-on-unload</param-name>
		<param-value>true</param-value>
	</init-param>
	<init-param>
		<param-name>wait-on-shutdown</param-name>
		<param-value>true</param-value>
	</init-param>
	<init-param>
		<param-name>start-scheduler-on-load</param-name>
		<param-value>true</param-value>
	</init-param>
</servlet>

<servlet>
	<servlet-name>APIScheduler</servlet-name>
	<servlet-class>com.company.APIScheduler</servlet-class>
	<load-on-startup>2</load-on-startup>
</servlet>

 

4. 설정을 위하여 quartz.properties 를 작업하여 web.xml에서 지정한 위치에 저장합니다

org.quartz.scheduler.instanceName = APIScheduler 
org.quartz.scheduler.instanceId = AUTO  
org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool  
org.quartz.threadPool.threadCount = 12  
org.quartz.threadPool.threadPriority = 5  
org.quartz.jobStore.misfireThreshold = 60000  
org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore 

 

5. 스케쥴링 시작하는 Servlet을 작성합니다

package com.company.scheduler;

import static org.quartz.CronScheduleBuilder.cronSchedule;
import static org.quartz.JobBuilder.newJob;
import static org.quartz.TriggerBuilder.newTrigger;

import javax.servlet.http.HttpServlet;

import org.quartz.CronTrigger;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SchedulerFactory;
import org.quartz.impl.StdSchedulerFactory;

import com.company.scheduler.job.BillInfoJob;

public class APIScheduler extends HttpServlet {

	private static final long serialVersionUID = 1L;
	
	private SchedulerFactory schedulerFactory;  
	private Scheduler scheduler;  

	public APIScheduler() {  
		try {  
			schedulerFactory = new StdSchedulerFactory();
			scheduler = schedulerFactory.getScheduler();
		}
		catch (SchedulerException e) {  
			e.printStackTrace();  
		}  
	}  

	@Override
	public void init() {
		try {  
			JobDetail job = newJob(BillInfoJob.class)
					.withIdentity("job1", "group1")
					.build();

			CronTrigger trigger = newTrigger()
					.withIdentity("trigger1", "group1")
					.withSchedule(cronSchedule("0 0 15 * * ?")) //오후3시마다
//					.withSchedule(cronSchedule("0 0/2 * * * ?")) //2분마다
					.build();

			scheduler.scheduleJob(job, trigger);

			scheduler.start(); 
//			scheduler.shutdown(true);
		}
		catch (SchedulerException e) {  
			e.printStackTrace();  
		}  
	}
}

 

6. 실제로 수행되는 Job을 작성합니다

package com.company.scheduler.job;

import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;

public class BillInfoJob implements Job {

	public void execute(JobExecutionContext context) throws JobExecutionException {
		System.out.println("=========== 작업합니다 =========");
	}
}

 

7. 이제 서버를 구동하면 실행됩니다 ^^*