1. Job
: 수행시켜야 할 일(Task)
2. JobDetail
: 위1의 Job에 대한 상세정보
- 위 1의 Job을 포함
- Identity : Job Name, Job Group
- Job에 전달할 데이터 설정
3. trigger
: 위 2에 대한 "스케쥴링"(When? How?) 정보
- Identity: name, group 설정
- JobDetail을 언제 시작시킬 건가!?
- 실행주기(반복적 or 1회성) 설정
4. Scheduler
- Scheduling된 Job을 실제 수행시키는 서버프로그램 - Trigger(스케줄링)를 등록하고, - JobDetail(실제수행시킬Job)을 등록하고 - Trigger대로 JobDetail을 수행시킬 책임
5. Listener (3가지 종류)
(1) Scheduler 자체의 Event Listenning (2) Job Event Listenning (3) Trigger Event Listenning
6. Runnable Jar 파일 생성
(1) jar파일 내에서 main메서드를 가진 class를 찾아서 실행시킨다.
lombok에서 사용하는 편리한기능 이 어노테이션들과 비슷한 형태로 쿼츠가 사용된다.
-new연산자를 사용하지 않음.@Data = > 자바 빈즈 클래스를 만드는 어노테이션
1. @Accessors(fluent=true)
-게터와 세터의 메서드를 변수의 이름으로 바꾼다.
-기본적으로 게터와 세터가 있어야한다.2. @Accessors(fluent=true , chain =true)
-setter의 메서드를 자기자신으로 반환시켜 설정하고싶은 메소드를 연속적으로 부르는게 가능해짐.
@Builder
-builder 메서드를 통해 BuildPatternBuilder를 객체를 생성한다.
-그 상태에서 세터를 이용해 정보 주입
-build 메서드를 통해서 해당 클래스의 객체를 생성한다.
public class Main {
public static void main(String[] args) {
Person person = Person
.builder()
.age(2)
.name("민들레씨")
.build();
System.out.println("내 나이는 " + person.age() + " 내 이름은 " +person.name());
}// main
}//end class
@Builder
@Accessors(fluent = true, chain = true)
@Data
class Person{
private int age;
private String name;
}// end class
@Log4j2
@NoArgsConstructor
// Newly This Object Created Each Execution.
public class JobA implements Job {
@Override
public void execute(JobExecutionContext ctx) throws JobExecutionException {
log.trace("execute({}) invoked.", ctx);
try {
// Batch Job 구현코드 작성 (통계산출, 정산 ,요금)
log.info("- Job A -");
} catch(Exception e) {
throw new JobExecutionException(e);
} // try-catch
} // execute
} // end class
// ============================================
// 1. To create a Quartz job scheduler
// ============================================
Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
// ============================================
// 2. To create a Quartz job with the associated trigger
// ============================================
JobDetail simpleJob = // Quartz Job to be scheduled.
JobBuilder.newJob( SimpleJob.class ).
// withIdentity("simpleJob", "GROUP1").
withIdentity( JobKey.jobKey("simpleJob", "GROUP1") ).
usingJobData("jobSays", "Hello World!").
usingJobData("myFloatValue", 3.141f).
build();
Trigger simpleJobTrigger = // Job Scheduling registered to the Quartz Scheduler.
TriggerBuilder.newTrigger().
// withIdentity("simpleJobTrigger", "GROUP1").
withIdentity( TriggerKey.triggerKey("simpleJobTrigger", "GROUP1") ).
startNow().
withSchedule(
SimpleScheduleBuilder.simpleSchedule().
// withIntervalInMilliseconds(1000*1L). // in milliseconds
withIntervalInSeconds(1). // in seconds
// withIntervalInMinutes(1). // in minutes
// withIntervalInHours(1). // in hours
repeatForever()
// withRepeatCount(10)
).
build();
// ============================================
// 3. To add each listener with Quartz job, trigger, scheduler
// ============================================
ListenerManager listenerManager = scheduler.getListenerManager();
listenerManager.addJobListener(new JobListenerImpl());
listenerManager.addTriggerListener(new TriggerListenerImpl());
listenerManager.addSchedulerListener(new SchedulerListenerImpl());
( SchedulerListener/TriggerListener 도 있지만 안했숨둥 비슷한 맥락 )
@Log4j2
@NoArgsConstructor
public class JobListenerImpl implements JobListener {
@Override
public String getName() {
log.trace("getName() invoked.");
return "- JobListener -";
} // getName
@Override
public void jobToBeExecuted(JobExecutionContext ctx) {
log.trace("jobToBeExecuted({}) invoked.", ctx);
} // jobToBeExecuted
@Override
public void jobExecutionVetoed(JobExecutionContext ctx) {
log.trace("jobExecutionVetoed({}) invoked.", ctx);
} // jobExecutionVetoed
@Override
public void jobWasExecuted(JobExecutionContext ctx, JobExecutionException e) {
log.trace("jobWasExecuted({}, {}) invoked.", ctx, e);
} // jobWasExecuted
} // end class
// ============================================
// 4. To schedule Quartz Jobs with Job and Trigger
// ============================================
scheduler.scheduleJob(simpleJob, simpleJobTrigger);
scheduler.scheduleJob(jobA, jobATrigger);
scheduler.scheduleJob(jobB, jobBTrigger);
// ============================================
// 5. To start a Quartz Scheduler
// ============================================
scheduler.start();
// Newly This Object Created Each Execution.
public class SimpleJob implements Job {
@Override
public void execute(JobExecutionContext ctx) throws JobExecutionException {
log.trace("execute({}) invoked.", ctx);
try {
JobDataMap dataMap = ctx.getJobDetail().getJobDataMap();
String jobSays = dataMap.getString("jobSays");
float myFloatValue = dataMap.getFloat("myFloatValue");
log.info("- SimpleJob says: {}, and val is: {}", jobSays ,myFloatValue);
} catch(Exception e) {
throw new JobExecutionException(e);
} // try-catch
} // execute
} // end class