학습자료/Java 2015. 7. 22. 10:11

자바에는 기본적으로 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
posted by cozyboy
: