자바에는 기본적으로 ScheduledJob과 Timer 이용하여 간단한 스케줄링이 가능하다.
하지만 30분 마다 0에 , 월요일부터 금요일까지 와 같이 디테일하게 스케줄링은 하기 어렵다.
리눅스에 crontab 이라는 스케줄링 데몬이 있는데 자바에서 그와 같은 동작을 하는 라이브러리를 사용하겠다.
crontab 사용
예)
20 2 * * 6 명령어 => 매주 토요일 새벽 2:20
0 4-6 * * * 명령어 => 매일 오후 4,5,6시
5 */2 * * * 명령어 => 매일 2시간간격으로 5분대에
15 1 1 * * 명령어 => 매월 1일 새벽 1:15
30 0 1 1,7 * 명령어 => 1,7월 1일 새벽 0:30
quartz 라이브러리 다운로드(2.2.1)
http://quartz-scheduler.org/downloads
quartz 크론 표기법
http://quartz-scheduler.org/api/2.2.0/org/quartz/CronExpression.html
Field Name | Allowed Values | Allowed Special Characters | ||
---|---|---|---|---|
Seconds | 0-59 | , - * / | ||
Minutes | 0-59 | , - * / | ||
Hours | 0-23 | , - * / | ||
Day-of-month | 1-31 | , - * ? / L W | ||
Month | 1-12 or JAN-DEC | , - * / | ||
Day-of-Week | 1-7 or SUN-SAT | , - * ? / L # | ||
Year (Optional) | empty, 1970-2199 | , - * / |
1. main class (스케줄러에 job 등록, job에 데이터 바인딩, 스케줄러 주기 세팅)
public class CronTest {
public CronTest() {
try {
ArrayList state = new ArrayList<String>();
//주기적으로 실행시클 job 클래스 등록
//job 클래스는 생성자에 인자가 들어가면 안됨, inner class로 생성하면 안됨.
//job 클래스에 데이터 전송
JobDetail job = JobBuilder.newJob(DumbJob.class)
.withIdentity("testJob")
.usingJobData("jobSays", "Hello World!")
.usingJobData("myFloatValue", 3.141f).build();
job.getJobDataMap().put("state", state);
// 10초마다 계속 돌기 java Timer와 비슷
/*
* Trigger trigger = TriggerBuilder.newTrigger()
* .withSchedule(SimpleScheduleBuilder.simpleSchedule()
* .withIntervalInSeconds(10) .repeatForever()) .build();
*/
// CronTrigger 매 10초마다(10,20,30 ...) 작업 실행
CronTrigger cronTrigger = TriggerBuilder
.newTrigger()
.withIdentity("crontrigger", "crontriggergroup1")
.withSchedule(
CronScheduleBuilder.cronSchedule("*/10 * * * * ?"))
.build();
// schedule the job
SchedulerFactory schFactory = new StdSchedulerFactory();
Scheduler sch = schFactory.getScheduler();
//스케줄러 시작
sch.start();
sch.scheduleJob(job, cronTrigger);
// 스케줄러 정지 sch.shutdown();
} catch (SchedulerException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
new CronTest();
}
}
2. job 구현
public class DumbJob implements Job {
String jobSays;
float myFloatValue;
ArrayList state;
public DumbJob() {
}
//스케줄러에 인해 주기적으로 실행되는 함수.
public void execute(JobExecutionContext context)
throws JobExecutionException
{
JobKey key = context.getJobDetail().getKey();
JobDataMap dataMap = context.getMergedJobDataMap();
//데이터는 아래 setter에서 저장된다. 혹은 아래와 같이 얻어도 된다.
/*
String jobSays = dataMap.getString("jobSays");
float myFloatValue = dataMap.getFloat("myFloatValue");
ArrayList state = (ArrayList) dataMap.get("myStateData");
*/
state.add(new Date());
System.err.println("Instance " + key + " of DumbJob says: " + jobSays + ", and val is: " + myFloatValue + ", state size:" + state.size() + "," +state.get(state.size()-1));
}
//아래와 같이 setter 형식으로 값을 받을 수도 있고 혹은, datamap을 통해 얻을 수 있음
public void setJobSays(String jobSays) {
this.jobSays = jobSays;
}
public void setMyFloatValue(float myFloatValue) {
this.myFloatValue = myFloatValue;
}
public void setState(ArrayList state) {
this.state = state;
}}
3. 실행결과
Instance DEFAULT.testJob of DumbJob says: Hello World!, and val is: 3.141, state size:1,Wed Jul 22 10:03:40 KST 2015
Instance DEFAULT.testJob of DumbJob says: Hello World!, and val is: 3.141, state size:2,Wed Jul 22 10:03:50 KST 2015
Instance DEFAULT.testJob of DumbJob says: Hello World!, and val is: 3.141, state size:3,Wed Jul 22 10:04:00 KST 2015
.....
참고
quartz 사이트(tutorials, examples, cookbook)
http://quartz-scheduler.org/documentation/quartz-2.2.x/quick-start
'학습자료 > Java' 카테고리의 다른 글
[java] 자바어플에 webview(javafx) 삽입 (0) | 2015.03.16 |
---|---|
[java] jTable 실시간 값 변경 (0) | 2015.01.08 |
[java] timetask (0) | 2015.01.08 |
[java] 파일 실행 (0) | 2015.01.08 |
[java] html 파싱, jsoup 예제 (0) | 2015.01.08 |