1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 | import static org.quartz.JobBuilder.newJob; import static org.quartz.TriggerBuilder.newTrigger; import org.quartz.*; import org.quartz.impl.*; public abstract class ChainableJob implements Job { private static final String CHAIN_JOB_CLASS = "chainedJobClass"; private static final String CHAIN_JOB_NAME = "chainedJobName"; private static final String CHAIN_JOB_GROUP = "chainedJobGroup"; @Override public void execute(JobExecutionContext context) throws JobExecutionException { // execute actual job code doExecute(context); // if chainJob() was called, chain the target job, passing on the JobDataMap if (context.getJobDetail().getJobDataMap().get(CHAIN_JOB_CLASS) != null) { try { chain(context); } catch (SchedulerException e) { e.printStackTrace(); } } } // actually schedule the chained job to run now private void chain(JobExecutionContext context) throws SchedulerException { JobDataMap map = context.getJobDetail().getJobDataMap(); @SuppressWarnings("unchecked") Class jobClass = (Class) map.remove(CHAIN_JOB_CLASS); String jobName = (String) map.remove(CHAIN_JOB_NAME); String jobGroup = (String) map.remove(CHAIN_JOB_GROUP); JobDetail jobDetail = newJob(jobClass) .withIdentity(jobName, jobGroup) .usingJobData(map) .build(); Trigger trigger = newTrigger() .withIdentity(jobName + "Trigger", jobGroup + "Trigger") .startNow() .build(); System.out.println("Chaining " + jobName); StdSchedulerFactory.getDefaultScheduler().scheduleJob(jobDetail, trigger); } protected abstract void doExecute(JobExecutionContext context) throws JobExecutionException; // trigger job chain (invocation waits for job completion) protected void chainJob(JobExecutionContext context, Class jobClass, String jobName, String jobGroup) { JobDataMap map = context.getJobDetail().getJobDataMap(); map.put(CHAIN_JOB_CLASS, jobClass); map.put(CHAIN_JOB_NAME, jobName); map.put(CHAIN_JOB_GROUP, jobGroup); } } | cs |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | import java.util.*; import org.quartz.*; public class TestJob extends ChainableJob { @Override protected void doExecute(JobExecutionContext context) throws JobExecutionException { JobDataMap map = context.getJobDetail().getJobDataMap(); System.out.println("Executing " + context.getJobDetail().getKey().getName() + " with " + new LinkedHashMap(map)); boolean alreadyChained = map.get("jobValue") != null; if (!alreadyChained) { map.put("jobTime", new Date().toString()); map.put("jobValue", new Random().nextLong()); } if (!alreadyChained && new Random().nextBoolean()) { chainJob(context, TestJob.class, "secondJob", "secondJobGroup"); } } } | cs |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | import org.quartz.*; import org.quartz.impl.*; public class Test { public static void main(String[] args) throws Exception { // start up scheduler StdSchedulerFactory.getDefaultScheduler().start(); JobDetail job = JobBuilder.newJob(TestJob.class) .withIdentity("firstJob", "firstJobGroup").build(); // Trigger our source job to triggers another Trigger trigger = TriggerBuilder.newTrigger() .withIdentity("firstJobTrigger", "firstJobbTriggerGroup") .startNow() .withSchedule( SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(1) .repeatForever()).build(); StdSchedulerFactory.getDefaultScheduler().scheduleJob(job, trigger); Thread.sleep(5000); // let job run a few times StdSchedulerFactory.getDefaultScheduler().shutdown(); } } | cs |
https://dzone.com/articles/job-chaining-quartz-and
https://dzone.com/articles/job-chaining-quartz-and
https://dzone.com/articles/job-chaining-quartz-and
아주 훌륭한 예제입니다 굿잡
'spring' 카테고리의 다른 글
[Spring Boot]Spring Boot 에서 외부 library 추가하고 spring-boot-maven-plugin 로 Build 하기 (2) | 2019.04.10 |
---|---|
[Spring] Spring quartz 와 @Autowired (2) | 2019.03.11 |
[Mybatis] 다중 업데이트문 (0) | 2019.01.07 |
[Spring boot] Spring boot application.xml 설정값 (0) | 2018.12.24 |
[Mybatis] Cause: java.lang.NumberFormatException: For input string 에러 (0) | 2018.11.30 |