quartz 사용 하기

http://www.quartz-scheduler.org/documentation/quartz-2.2.x/quick-start.html

프로젝트 만들고 , lib 안에 다운로드 받은 jar 들 복사 후 QuartzTest.java 생성

1. 샘플

================================================
QuartzTest.java
================================================
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.impl.StdSchedulerFactory;
import static org.quartz.JobBuilder.*;
import static org.quartz.TriggerBuilder.*;
import static org.quartz.SimpleScheduleBuilder.*;

public class QuartzTest {

public static void main(String[] args) {

try {
// Grab the Scheduler instance from the Factory
Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();

// and start it off
scheduler.start();

scheduler.shutdown();

} catch (SchedulerException se) {
se.printStackTrace();
}
}
}

=======================================================
log4j.properties 생성
=======================================================

# Set root logger level to DEBUG and its only appender to A1.
log4j.rootLogger=DEBUG, A1

# A1 is set to be a ConsoleAppender.
log4j.appender.A1=org.apache.log4j.ConsoleAppender

# A1 uses PatternLayout.
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n


=======================================================
실행결과
=======================================================
0    [main] INFO  org.quartz.impl.StdSchedulerFactory  - Using default implementation for ThreadExecutor
6    [main] INFO  org.quartz.simpl.SimpleThreadPool  - Job execution threads will use class loader of thread: main
28   [main] INFO  org.quartz.core.SchedulerSignalerImpl  - Initialized Scheduler Signaller of type: class org.quartz.core.SchedulerSignalerImpl
28   [main] INFO  org.quartz.core.QuartzScheduler  - Quartz Scheduler v.2.2.3 created.
30   [main] INFO  org.quartz.simpl.RAMJobStore  - RAMJobStore initialized.
31   [main] INFO  org.quartz.core.QuartzScheduler  - Scheduler meta-data: Quartz Scheduler (v2.2.3) 'DefaultQuartzScheduler' with instanceId 'NON_CLUSTERED'
  Scheduler class: 'org.quartz.core.QuartzScheduler' - running locally.
  NOT STARTED.
  Currently in standby mode.
  Number of jobs executed: 0
  Using thread pool 'org.quartz.simpl.SimpleThreadPool' - with 10 threads.
  Using job-store 'org.quartz.simpl.RAMJobStore' - which does not support persistence. and is not clustered.

31   [main] INFO  org.quartz.impl.StdSchedulerFactory  - Quartz scheduler 'DefaultQuartzScheduler' initialized from default resource file in Quartz package: 'quartz.properties'
31   [main] INFO  org.quartz.impl.StdSchedulerFactory  - Quartz scheduler version: 2.2.3
32   [main] INFO  org.quartz.core.QuartzScheduler  - Scheduler DefaultQuartzScheduler_$_NON_CLUSTERED started.
33   [main] INFO  org.quartz.core.QuartzScheduler  - Scheduler DefaultQuartzScheduler_$_NON_CLUSTERED shutting down.
33   [DefaultQuartzScheduler_QuartzSchedulerThread] DEBUG org.quartz.core.QuartzSchedulerThread  - batch acquisition of 0 triggers
33   [main] INFO  org.quartz.core.QuartzScheduler  - Scheduler DefaultQuartzScheduler_$_NON_CLUSTERED paused.
33   [main] DEBUG org.quartz.simpl.SimpleThreadPool  - Shutting down threadpool...
33   [main] DEBUG org.quartz.simpl.SimpleThreadPool  - Shutdown of threadpool complete.
33   [main] INFO  org.quartz.core.QuartzScheduler  - Scheduler DefaultQuartzScheduler_$_NON_CLUSTERED shutdown complete.
508  [DefaultQuartzScheduler_Worker-4] DEBUG org.quartz.simpl.SimpleThreadPool  - WorkerThread is shut down.
508  [DefaultQuartzScheduler_Worker-3] DEBUG org.quartz.simpl.SimpleThreadPool  - WorkerThread is shut down.
508  [DefaultQuartzScheduler_Worker-1] DEBUG org.quartz.simpl.SimpleThreadPool  - WorkerThread is shut down.
509  [DefaultQuartzScheduler_Worker-8] DEBUG org.quartz.simpl.SimpleThreadPool  - WorkerThread is shut down.
509  [DefaultQuartzScheduler_Worker-7] DEBUG org.quartz.simpl.SimpleThreadPool  - WorkerThread is shut down.
508  [DefaultQuartzScheduler_Worker-2] DEBUG org.quartz.simpl.SimpleThreadPool  - WorkerThread is shut down.
515  [DefaultQuartzScheduler_Worker-9] DEBUG org.quartz.simpl.SimpleThreadPool  - WorkerThread is shut down.
515  [DefaultQuartzScheduler_Worker-10] DEBUG org.quartz.simpl.SimpleThreadPool  - WorkerThread is shut down.
515  [DefaultQuartzScheduler_Worker-5] DEBUG org.quartz.simpl.SimpleThreadPool  - WorkerThread is shut down.
515  [DefaultQuartzScheduler_Worker-6] DEBUG org.quartz.simpl.SimpleThreadPool  - WorkerThread is shut down.

2. Hello Job Test

================================================
QuartzTest.java
================================================
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.Trigger;
import org.quartz.impl.StdSchedulerFactory;
import static org.quartz.JobBuilder.*;
import static org.quartz.TriggerBuilder.*;

import org.quartz.JobBuilder;
import org.quartz.JobDetail;

import static org.quartz.SimpleScheduleBuilder.*;

public class QuartzTest {

public static void main(String[] args) {

try {
// Grab the Scheduler instance from the Factory
Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();

// and start it off
scheduler.start();

JobDetail job = newJob(HelloJob.class)
     .withIdentity("job1", "group1")
     .build();

// Trigger the job to run now, and then repeat every 40 seconds
 Trigger trigger = newTrigger()
     .withIdentity("trigger1", "group1")
     .startNow()
           .withSchedule(simpleSchedule()
             .withIntervalInSeconds(5)
             .repeatForever())            
     .build();

 // Tell quartz to schedule the job using our trigger
 scheduler.scheduleJob(job, trigger);


// scheduler.shutdown();

} catch (SchedulerException se) {
se.printStackTrace();
}
}


}
=========================================================
HelloJob.java
=========================================================
import org.apache.log4j.Logger;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;

public class HelloJob implements Job{

Logger logger = Logger.getLogger(HelloJob.class);

@Override
public void execute(JobExecutionContext arg0) throws JobExecutionException {

logger.debug("HelloJob executed");
}

}
========================================================

3. JOB 에 DATA 넘기기

================================================
QuartzTest.java
================================================
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.Trigger;
import org.quartz.impl.StdSchedulerFactory;
import static org.quartz.JobBuilder.*;
import static org.quartz.TriggerBuilder.*;
import org.quartz.JobDetail;
import static org.quartz.SimpleScheduleBuilder.*;

public class QuartzTest {

public static void main(String[] args) {

try {
// Grab the Scheduler instance from the Factory
Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();

// and start it off
scheduler.start();

JobDetail job = newJob(HelloJob.class)
     .withIdentity("job1", "group1")
     .usingJobData("jobSays", "Hello World!")
     .usingJobData("myFloatValue", 3.141f)
     .build();

// Trigger the job to run now, and then repeat every 40 seconds
 Trigger trigger = newTrigger()
     .withIdentity("trigger1", "group1")
     .startNow()
           .withSchedule(simpleSchedule()
             .withIntervalInSeconds(5)
             .repeatForever())            
     .build();

 // Tell quartz to schedule the job using our trigger
 scheduler.scheduleJob(job, trigger);


// scheduler.shutdown();

} catch (SchedulerException se) {
se.printStackTrace();
}
}


}
=========================================================
HelloJob.java
=========================================================
import org.apache.log4j.Logger;
import org.quartz.Job;
import org.quartz.JobDataMap;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.quartz.JobKey;

public class HelloJob implements Job {

Logger logger = Logger.getLogger(HelloJob.class);

@Override
public void execute(JobExecutionContext context) throws JobExecutionException {

logger.debug("HelloJob executed");
JobKey key = context.getJobDetail().getKey();

JobDataMap dataMap = context.getJobDetail().getJobDataMap();

String jobSays = dataMap.getString("jobSays");
float myFloatValue = dataMap.getFloat("myFloatValue");

logger.debug("Instance " + key + " of DumbJob says: " + jobSays + ", and val is: " + myFloatValue);
}

}



4. 스프링 부트에 적용 하기 


스프링이 로드 된 다음에 실행 하려면
Scheduler 를 만들고 ApplicationListener 를 구현 해 주면 된다.

public class SchedulerClass implements ApplicationListener<ContextRefreshedEvent>{

    public void onApplicationEvent(ContextRefreshedEvent contextRefreshedEvent ) {
             // do what you want - you can use all spring beans (this is the difference between init-method and @PostConstructor where you can't)
             // this class can be annotated as spring service, and you can use @Autowired in it

    }
}

5. 리스팅 jobs


for (String groupName : scheduler.getJobGroupNames()) {

for (JobKey jobKey : scheduler.getJobKeys(GroupMatcher.jobGroupEquals(groupName))) {

String jobName = jobKey.getName();
String jobGroup = jobKey.getGroup();

// get job's trigger
List<Trigger> triggers = (List<Trigger>) scheduler.getTriggersOfJob(jobKey);
Date nextFireTime = triggers.get(0).getNextFireTime();

System.out.println("[jobName] : " + jobName + " [groupName] : " + jobGroup + " - " + nextFireTime);

}

}

6.  maven 통합

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


7. 스프링 부트 통합

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.3.2.RELEASE</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>
<dependencies>
    <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.quartz-scheduler</groupId>
        <artifactId>quartz</artifactId>
        <version>2.3.0</version>
    </dependency>
</dependencies>

8. 데이터 베이스 연동









댓글