一、版本說明
spring3.1以下的版本必須使用quartz1.x系列,3.1以上的版本才支持quartz 2.x,不然會出錯。
原因:spring對於quartz的支持實現,org.springframework.scheduling.quartz.CronTriggerBean繼承了org.quartz.CronTrigger,在quartz1.x系列中org.quartz.CronTrigger是個類,而在quartz2.x系列中org.quartz.CronTrigger變成了接口,從而造成無法用spring的方式配置quartz的觸發器(trigger)
此示例所選版本:spring版本號3.0.7.RELEASE,quartz版本1.8.6
二、添加jar包
我的是maven工程,pom.xml相關配置如下:
<properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <spring.version>3.0.7.RELEASE</spring.version> <quartz.version>1.8.6</quartz.version> </properties>
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${spring.version}</version> <exclusions> <!-- Exclude Commons Logging in favor of SLF4j --> <exclusion> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> </exclusion> </exclusions> </dependency> <dependency><!--3.0.7沒這個包 --> <groupId>org.springframework</groupId> <artifactId>spring-context-support</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-orm</artifactId> <version>${spring.version}</version> <type>jar</type> <scope>compile</scope> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>${spring.version}</version> <type>jar</type> <scope>test</scope> </dependency>
<dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz</artifactId> <version>${quartz.version}</version> </dependency>
三、整合實現
1、spring配置
spring只需要添加quartz調度工廠bean就可以了
<bean id="schedulerFactoryBean" class="org.springframework.scheduling.quartz.SchedulerFactoryBean" />
2、定時器工作類實現
定義定時器作業類,該類繼承自job類
package com.ld.nhmz.quartz; import java.text.SimpleDateFormat; import java.util.Date; import org.quartz.Job; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; /** * quartz示例定時器類 * * @author Administrator * */ public class QuartzJobExample implements Job { @Override public void execute(JobExecutionContext arg0) throws JobExecutionException { System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()) + "★★★★★★★★★★★"); } }
定義定時器管理類
package com.ld.nhmz.quartz; import org.quartz.CronTrigger; import org.quartz.JobDetail; import org.quartz.Scheduler; /** * Quartz調度管理器 * * @author Administrator * */ public class QuartzManager { private static String JOB_GROUP_NAME = "EXTJWEB_JOBGROUP_NAME"; private static String TRIGGER_GROUP_NAME = "EXTJWEB_TRIGGERGROUP_NAME"; /** * @Description: 添加一個定時任務,使用默認的任務組名,觸發器名,觸發器組名 * * @param sched * 調度器 * * @param jobName * 任務名 * @param cls * 任務 * @param time * 時間設置,參考quartz說明文檔 * * @Title: QuartzManager.java */ public static void addJob(Scheduler sched, String jobName, @SuppressWarnings("rawtypes") Class cls, String time) { try { JobDetail jobDetail = new JobDetail(jobName, JOB_GROUP_NAME, cls);// 任務名,任務組,任務執行類 // 觸發器 CronTrigger trigger = new CronTrigger(jobName, TRIGGER_GROUP_NAME);// 觸發器名,觸發器組 trigger.setCronExpression(time);// 觸發器時間設定 sched.scheduleJob(jobDetail, trigger); // 啟動 if (!sched.isShutdown()) { sched.start(); } } catch (Exception e) { throw new RuntimeException(e); } } /** * @Description: 添加一個定時任務 * * @param sched * 調度器 * * @param jobName * 任務名 * @param jobGroupName * 任務組名 * @param triggerName * 觸發器名 * @param triggerGroupName * 觸發器組名 * @param jobClass * 任務 * @param time * 時間設置,參考quartz說明文檔 * * @Title: QuartzManager.java */ public static void addJob(Scheduler sched, String jobName, String jobGroupName, String triggerName, String triggerGroupName, @SuppressWarnings("rawtypes") Class jobClass, String time) { try { JobDetail jobDetail = new JobDetail(jobName, jobGroupName, jobClass);// 任務名,任務組,任務執行類 // 觸發器 CronTrigger trigger = new CronTrigger(triggerName, triggerGroupName);// 觸發器名,觸發器組 trigger.setCronExpression(time);// 觸發器時間設定 sched.scheduleJob(jobDetail, trigger); } catch (Exception e) { throw new RuntimeException(e); } } /** * @Description: 修改一個任務的觸發時間(使用默認的任務組名,觸發器名,觸發器組名) * * @param sched * 調度器 * @param jobName * @param time * * @Title: QuartzManager.java */ @SuppressWarnings("rawtypes") public static void modifyJobTime(Scheduler sched, String jobName, String time) { try { CronTrigger trigger = (CronTrigger) sched.getTrigger(jobName, TRIGGER_GROUP_NAME); if (trigger == null) { return; } String oldTime = trigger.getCronExpression(); if (!oldTime.equalsIgnoreCase(time)) { JobDetail jobDetail = sched.getJobDetail(jobName, JOB_GROUP_NAME); Class objJobClass = jobDetail.getJobClass(); removeJob(sched, jobName); addJob(sched, jobName, objJobClass, time); } } catch (Exception e) { throw new RuntimeException(e); } } /** * @Description: 修改一個任務的觸發時間 * * @param sched * 調度器 * * @param sched * 調度器 * @param triggerName * @param triggerGroupName * @param time * * @Title: QuartzManager.java */ public static void modifyJobTime(Scheduler sched, String triggerName, String triggerGroupName, String time) { try { CronTrigger trigger = (CronTrigger) sched.getTrigger(triggerName, triggerGroupName); if (trigger == null) { return; } String oldTime = trigger.getCronExpression(); if (!oldTime.equalsIgnoreCase(time)) { CronTrigger ct = (CronTrigger) trigger; // 修改時間 ct.setCronExpression(time); // 重啟觸發器 sched.resumeTrigger(triggerName, triggerGroupName); } } catch (Exception e) { throw new RuntimeException(e); } } /** * @Description: 移除一個任務(使用默認的任務組名,觸發器名,觸發器組名) * * @param sched * 調度器 * @param jobName * * @Title: QuartzManager.java */ public static void removeJob(Scheduler sched, String jobName) { try { sched.pauseTrigger(jobName, TRIGGER_GROUP_NAME);// 停止觸發器 sched.unscheduleJob(jobName, TRIGGER_GROUP_NAME);// 移除觸發器 sched.deleteJob(jobName, JOB_GROUP_NAME);// 刪除任務 } catch (Exception e) { throw new RuntimeException(e); } } /** * @Description: 移除一個任務 * * @param sched * 調度器 * @param jobName * @param jobGroupName * @param triggerName * @param triggerGroupName * * @Title: QuartzManager.java */ public static void removeJob(Scheduler sched, String jobName, String jobGroupName, String triggerName, String triggerGroupName) { try { sched.pauseTrigger(triggerName, triggerGroupName);// 停止觸發器 sched.unscheduleJob(triggerName, triggerGroupName);// 移除觸發器 sched.deleteJob(jobName, jobGroupName);// 刪除任務 } catch (Exception e) { throw new RuntimeException(e); } } /** * @Description:啟動所有定時任務 * * @param sched * 調度器 * * @Title: QuartzManager.java */ public static void startJobs(Scheduler sched) { try { sched.start(); } catch (Exception e) { throw new RuntimeException(e); } } /** * @Description:關閉所有定時任務 * * * @param sched * 調度器 * * * @Title: QuartzManager.java */ public static void shutdownJobs(Scheduler sched) { try { if (!sched.isShutdown()) { sched.shutdown(); } } catch (Exception e) { throw new RuntimeException(e); } } }
測試代碼,這里SchedulerFactory沒有使用spring中配置的bean,而是new出來的,做測試用
package com.ld.nhmz.quartz.test; import org.junit.Test; import org.quartz.Scheduler; import org.quartz.SchedulerFactory; import org.quartz.impl.StdSchedulerFactory; import com.ld.nhmz.quartz.QuartzJobExample; import com.ld.nhmz.quartz.QuartzManager; /** * @Description: 測試類 * * @ClassName: QuartzTest.java */ public class QuartzTest { @Test public void quartz() { try { SchedulerFactory gSchedulerFactory = new StdSchedulerFactory(); Scheduler sche = gSchedulerFactory.getScheduler(); String job_name = "動態任務調度"; System.out.println("【系統啟動】開始(每1秒輸出一次)..."); QuartzManager.addJob(sche, job_name, QuartzJobExample.class, "0/1 * * * * ?"); Thread.sleep(3000); System.out.println("【修改時間】開始(每2秒輸出一次)..."); QuartzManager.modifyJobTime(sche, job_name, "10/2 * * * * ?"); Thread.sleep(4000); System.out.println("【移除定時】開始..."); QuartzManager.removeJob(sche, job_name); System.out.println("【移除定時】成功"); System.out.println("【再次添加定時任務】開始(每10秒輸出一次)..."); QuartzManager.addJob(sche, job_name, QuartzJobExample.class, "*/10 * * * * ?"); Thread.sleep(30000); System.out.println("【移除定時】開始..."); QuartzManager.removeJob(sche, job_name); System.out.println("【移除定時】成功"); } catch (Exception e) { e.printStackTrace(); } } }
顯示結果:
spring Control層代碼中實現定時器管理