1.添加pom.xml
<dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz</artifactId> <version>2.2.3</version> </dependency> <!-- https://mvnrepository.com/artifact/org.quartz-scheduler/quartz-jobs --> <dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz-jobs</artifactId> <version>2.2.3</version> </dependency>
2.添加配置文件,或者不添加使用默認也行,默認線程池數量為10
打開quartz的jar包,可以找到該配置 quartz.properties

復制到資源目錄下修改如下
org.quartz.scheduler.instanceName: DemoQuartz org.quartz.scheduler.rmi.export: false org.quartz.scheduler.rmi.proxy: false org.quartz.scheduler.wrapJobExecutionInUserTransaction: false org.quartz.threadPool.class: org.quartz.simpl.SimpleThreadPool #線程池數量 org.quartz.threadPool.threadCount: 1 org.quartz.threadPool.threadPriority: 5 org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread: true org.quartz.jobStore.misfireThreshold: 60000 org.quartz.jobStore.class: org.quartz.simpl.RAMJobStore
3.編寫job
DemoJob.class,HelloJob.class
實現接口 org.quartz.Job
package com.yun.base.job; import java.util.Calendar; import org.quartz.Job; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; import org.quartz.SchedulerException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class HelloJob implements Job { private static final Logger LOGGER = LoggerFactory.getLogger(HelloJob.class); @Override public void execute(JobExecutionContext context) throws JobExecutionException { try { LOGGER.info(context.getScheduler().getSchedulerName()); String jobParam = (String) context.getJobDetail().getJobDataMap().get("jobParam"); if (jobParam != null) { LOGGER.info(jobParam.toString()); } LOGGER.info(Integer.toString(Calendar.getInstance().get(Calendar.SECOND))); } catch (SchedulerException e) { e.printStackTrace(); } } }
4.編寫任務管理工具類 JobSchedule
package com.yun.util; import org.quartz.CronScheduleBuilder; import org.quartz.CronTrigger; import org.quartz.JobBuilder; import org.quartz.JobDetail; import org.quartz.JobKey; import org.quartz.Scheduler; import org.quartz.SchedulerException; import org.quartz.SchedulerFactory; import org.quartz.Trigger; import org.quartz.TriggerBuilder; import org.quartz.TriggerKey; import org.quartz.impl.StdSchedulerFactory; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class JobSchedule { private static final Logger LOGGER = LoggerFactory.getLogger(JobSchedule.class); private static SchedulerFactory gSchedulerFactory = new StdSchedulerFactory(); private static String JOB_GROUP_NAME = "YUN_JOBGROUP_NAME"; private static String TRIGGER_GROUP_NAME = "YUN_TRIGGERGROUP_NAME"; private JobSchedule(){ } /** * @Description: 添加一個定時任務,使用默認的任務組名,觸發器名,觸發器組名 * * @param jobName * 任務名 * @param cls * 任務 * @param cron * 時間設置,參考quartz說明文檔 * @throws SchedulerException * */ public static void addJob(String jobName, Class cls, String cron) throws SchedulerException { Scheduler sched = gSchedulerFactory.getScheduler(); // 用於描敘Job實現類及其他的一些靜態信息,構建一個作業實例 JobDetail jobDetail = JobBuilder.newJob(cls) .withIdentity(jobName, JOB_GROUP_NAME).build(); // 構建一個觸發器,規定觸發的規則 Trigger trigger = TriggerBuilder.newTrigger()// 創建一個新的TriggerBuilder來規范一個觸發器 .withIdentity(jobName, TRIGGER_GROUP_NAME)// 給觸發器起一個名字和組名 .startNow()// 立即執行 .withSchedule(CronScheduleBuilder.cronSchedule(cron)) // 觸發器的執行時間 .build();// 產生觸發器 sched.scheduleJob(jobDetail, trigger); LOGGER.debug("添加任務:{},{},{}",jobName,cls,cron); // 啟動 if (!sched.isShutdown()) { sched.start(); } } /** * @Description: 添加一個定時任務 * * @param jobName * 任務名 * @param jobGroupName * 任務組名 * @param triggerName * 觸發器名 * @param triggerGroupName * 觸發器組名 * @param jobClass * 任務 * @param cron * 時間設置,參考quartz說明文檔 */ public static void addJob(String jobName, String jobGroupName, String triggerName, String triggerGroupName, Class cls, String cron) throws SchedulerException { Scheduler sched = gSchedulerFactory.getScheduler(); // 用於描敘Job實現類及其他的一些靜態信息,構建一個作業實例 JobDetail jobDetail = JobBuilder.newJob(cls) .withIdentity(jobName, jobGroupName).build(); // 構建一個觸發器,規定觸發的規則 Trigger trigger = TriggerBuilder.newTrigger()// 創建一個新的TriggerBuilder來規范一個觸發器 .withIdentity(jobName, triggerGroupName)// 給觸發器起一個名字和組名 .startNow()// 立即執行 .withSchedule(CronScheduleBuilder.cronSchedule(cron)) // 觸發器的執行時間 .build();// 產生觸發器 sched.scheduleJob(jobDetail, trigger); LOGGER.debug("添加任務:{},{},{},{},{},{}",jobName,jobGroupName,triggerName,triggerGroupName,cls,cron); // 啟動 if (!sched.isShutdown()) { sched.start(); } } /** * @Description: 修改一個任務的觸發時間(使用默認的任務組名,觸發器名,觸發器組名) * * @param jobName * @param cron * @throws SchedulerException * */ public static void modifyJobTime(String jobName, String cron) throws SchedulerException { Scheduler sched = gSchedulerFactory.getScheduler(); TriggerKey triggerKey = new TriggerKey(jobName, TRIGGER_GROUP_NAME); CronTrigger trigger = (CronTrigger) sched.getTrigger(triggerKey); if (trigger == null) { return; } String oldTime = trigger.getCronExpression(); if (!oldTime.equalsIgnoreCase(cron)) { JobDetail jobDetail = sched.getJobDetail(new JobKey(jobName, JOB_GROUP_NAME)); Class objJobClass = jobDetail.getJobClass(); removeJob(jobName); addJob(jobName, objJobClass, cron); LOGGER.debug("修改任務:{},{}",jobName,cron); } } /** * @Description: 移除一個任務(使用默認的任務組名,觸發器名,觸發器組名) * * @param jobName * * @throws SchedulerException */ public static void removeJob(String jobName) throws SchedulerException { Scheduler sched = gSchedulerFactory.getScheduler(); JobKey jobKey = new JobKey(jobName, TRIGGER_GROUP_NAME); // 停止觸發器 sched.pauseJob(jobKey); sched.unscheduleJob(new TriggerKey(jobName, TRIGGER_GROUP_NAME));// 移除觸發器 sched.deleteJob(jobKey);// 刪除任務 LOGGER.debug("移除任務:{}",jobName); } /** * 移除任務 * * @param jobName * @param jobGroupName * @param triggerName * @param triggerGroupName * @throws SchedulerException */ public static void removeJob(String jobName, String jobGroupName, String triggerName, String triggerGroupName) throws SchedulerException { Scheduler sched = gSchedulerFactory.getScheduler(); JobKey jobKey = new JobKey(jobName, jobGroupName); // 停止觸發器 sched.pauseJob(jobKey); sched.unscheduleJob(new TriggerKey(jobName, triggerGroupName));// 移除觸發器 sched.deleteJob(jobKey);// 刪除任務 LOGGER.debug("移除任務:{},{},{},{},{},{}",jobName,jobGroupName,triggerName,triggerGroupName); } /** * 啟動所有任務 * * @throws SchedulerException */ public static void startJobs() throws SchedulerException { Scheduler sched = gSchedulerFactory.getScheduler(); sched.start(); LOGGER.debug("啟動所有任務"); } /** * 關閉所有定時任務 * * @throws SchedulerException * */ public static void shutdownJobs() throws SchedulerException { Scheduler sched = gSchedulerFactory.getScheduler(); if (!sched.isShutdown()) { sched.shutdown(); LOGGER.debug("關閉所有任務"); } } }
5.測試
@Test public void testTask() { try { String job_name = "動態任務調度"; System.out.println("【系統啟動】開始(每1秒輸出一次)..."); JobSchedule.addJob(job_name, DemoJob.class, "0/1 * * * * ?"); Thread.sleep(5000); System.out.println("【修改時間】開始(每2秒輸出一次)..."); JobSchedule.modifyJobTime(job_name, "10/2 * * * * ?"); Thread.sleep(6000); System.out.println("【移除定時】開始..."); JobSchedule.removeJob(job_name); System.out.println("【移除定時】成功"); System.out.println("【再次添加定時任務】開始(每10秒輸出一次)..."); JobSchedule.addJob(job_name, HelloJob.class, "*/10 * * * * ?"); Thread.sleep(60000); System.out.println("【移除定時】開始..."); JobSchedule.removeJob(job_name); System.out.println("【移除定時】成功"); } catch (Exception e) { e.printStackTrace(); } }
測試結果
【系統啟動】開始(每1秒輸出一次)... 2017-07-20 18:11:03.026 [main] DEBUG com.yun.util.JobSchedule - 添加任務:動態任務調度,class com.yun.base.job.DemoJob,0/1 * * * * ? 2017-07-20 18:11:03.042 [DemoQuartz_Worker-1] INFO com.yun.base.job.DemoJob - DemoQuartz 2017-07-20 18:11:03.042 [DemoQuartz_Worker-1] INFO com.yun.base.job.DemoJob - 3 2017-07-20 18:11:04.001 [DemoQuartz_Worker-1] INFO com.yun.base.job.DemoJob - DemoQuartz 2017-07-20 18:11:04.001 [DemoQuartz_Worker-1] INFO com.yun.base.job.DemoJob - 4 2017-07-20 18:11:05.004 [DemoQuartz_Worker-1] INFO com.yun.base.job.DemoJob - DemoQuartz 2017-07-20 18:11:05.004 [DemoQuartz_Worker-1] INFO com.yun.base.job.DemoJob - 5 2017-07-20 18:11:06.008 [DemoQuartz_Worker-1] INFO com.yun.base.job.DemoJob - DemoQuartz 2017-07-20 18:11:06.008 [DemoQuartz_Worker-1] INFO com.yun.base.job.DemoJob - 6 2017-07-20 18:11:07.012 [DemoQuartz_Worker-1] INFO com.yun.base.job.DemoJob - DemoQuartz 2017-07-20 18:11:07.012 [DemoQuartz_Worker-1] INFO com.yun.base.job.DemoJob - 7 2017-07-20 18:11:08.012 [DemoQuartz_Worker-1] INFO com.yun.base.job.DemoJob - DemoQuartz 2017-07-20 18:11:08.013 [DemoQuartz_Worker-1] INFO com.yun.base.job.DemoJob - 8 【修改時間】開始(每2秒輸出一次)... 2017-07-20 18:11:08.043 [main] DEBUG com.yun.util.JobSchedule - 移除任務:動態任務調度 2017-07-20 18:11:08.047 [main] DEBUG com.yun.util.JobSchedule - 添加任務:動態任務調度,class com.yun.base.job.DemoJob,10/2 * * * * ? 2017-07-20 18:11:08.047 [main] DEBUG com.yun.util.JobSchedule - 修改任務:動態任務調度,10/2 * * * * ? 2017-07-20 18:11:10.001 [DemoQuartz_Worker-1] INFO com.yun.base.job.DemoJob - DemoQuartz 2017-07-20 18:11:10.001 [DemoQuartz_Worker-1] INFO com.yun.base.job.DemoJob - 10 2017-07-20 18:11:12.013 [DemoQuartz_Worker-1] INFO com.yun.base.job.DemoJob - DemoQuartz 2017-07-20 18:11:12.013 [DemoQuartz_Worker-1] INFO com.yun.base.job.DemoJob - 12 2017-07-20 18:11:14.005 [DemoQuartz_Worker-1] INFO com.yun.base.job.DemoJob - DemoQuartz 2017-07-20 18:11:14.005 [DemoQuartz_Worker-1] INFO com.yun.base.job.DemoJob - 14 【移除定時】開始... 2017-07-20 18:11:14.054 [main] DEBUG com.yun.util.JobSchedule - 移除任務:動態任務調度 【移除定時】成功 【再次添加定時任務】開始(每10秒輸出一次)... 2017-07-20 18:11:14.054 [main] DEBUG com.yun.util.JobSchedule - 添加任務:動態任務調度,class com.yun.base.job.HelloJob,*/10 * * * * ? 2017-07-20 18:11:20.010 [DemoQuartz_Worker-1] INFO com.yun.base.job.HelloJob - DemoQuartz 2017-07-20 18:11:20.010 [DemoQuartz_Worker-1] INFO com.yun.base.job.HelloJob - 20 2017-07-20 18:11:30.006 [DemoQuartz_Worker-1] INFO com.yun.base.job.HelloJob - DemoQuartz 2017-07-20 18:11:30.006 [DemoQuartz_Worker-1] INFO com.yun.base.job.HelloJob - 30 2017-07-20 18:11:40.004 [DemoQuartz_Worker-1] INFO com.yun.base.job.HelloJob - DemoQuartz 2017-07-20 18:11:40.005 [DemoQuartz_Worker-1] INFO com.yun.base.job.HelloJob - 40 2017-07-20 18:11:50.007 [DemoQuartz_Worker-1] INFO com.yun.base.job.HelloJob - DemoQuartz 2017-07-20 18:11:50.007 [DemoQuartz_Worker-1] INFO com.yun.base.job.HelloJob - 50 2017-07-20 18:12:00.010 [DemoQuartz_Worker-1] INFO com.yun.base.job.HelloJob - DemoQuartz 2017-07-20 18:12:00.010 [DemoQuartz_Worker-1] INFO com.yun.base.job.HelloJob - 0 2017-07-20 18:12:10.000 [DemoQuartz_Worker-1] INFO com.yun.base.job.HelloJob - DemoQuartz 2017-07-20 18:12:10.000 [DemoQuartz_Worker-1] INFO com.yun.base.job.HelloJob - 10 【移除定時】開始... 2017-07-20 18:12:14.060 [main] DEBUG com.yun.util.JobSchedule - 移除任務:動態任務調度 【移除定時】成功
