Spring整合Quartz實現(xiàn)動態(tài)定時器的示例代碼
一、版本說明
spring3.1以下的版本必須使用quartz1.x系列,3.1以上的版本才支持quartz 2.x,不然會出錯。
原因:spring對于quartz的支持實現(xiàn),org.springframework.scheduling.quartz.CronTriggerBean繼承了org.quartz.CronTrigger,在quartz1.x系列中org.quartz.CronTrigger是個類,而在quartz2.x系列中org.quartz.CronTrigger變成了接口,從而造成無法用spring的方式配置quartz的觸發(fā)器(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>
三、整合實現(xiàn)
1、spring配置
spring只需要添加quartz調(diào)度工廠bean就可以了
<bean id="schedulerFactoryBean" class="org.springframework.scheduling.quartz.SchedulerFactoryBean" />
2、定時器工作類實現(xiàn)
定義定時器作業(yè)類,該類繼承自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調(diào)度管理器 * * @author Administrator * */ public class QuartzManager { private static String JOB_GROUP_NAME = "EXTJWEB_JOBGROUP_NAME"; private static String TRIGGER_GROUP_NAME = "EXTJWEB_TRIGGERGROUP_NAME"; /** * @Description: 添加一個定時任務,使用默認的任務組名,觸發(fā)器名,觸發(fā)器組名 * * @param sched * 調(diào)度器 * * @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);// 任務名,任務組,任務執(zhí)行類 // 觸發(fā)器 CronTrigger trigger = new CronTrigger(jobName, TRIGGER_GROUP_NAME);// 觸發(fā)器名,觸發(fā)器組 trigger.setCronExpression(time);// 觸發(fā)器時間設定 sched.scheduleJob(jobDetail, trigger); // 啟動 if (!sched.isShutdown()) { sched.start(); } } catch (Exception e) { throw new RuntimeException(e); } } /** * @Description: 添加一個定時任務 * * @param sched * 調(diào)度器 * * @param jobName * 任務名 * @param jobGroupName * 任務組名 * @param triggerName * 觸發(fā)器名 * @param triggerGroupName * 觸發(fā)器組名 * @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);// 任務名,任務組,任務執(zhí)行類 // 觸發(fā)器 CronTrigger trigger = new CronTrigger(triggerName, triggerGroupName);// 觸發(fā)器名,觸發(fā)器組 trigger.setCronExpression(time);// 觸發(fā)器時間設定 sched.scheduleJob(jobDetail, trigger); } catch (Exception e) { throw new RuntimeException(e); } } /** * @Description: 修改一個任務的觸發(fā)時間(使用默認的任務組名,觸發(fā)器名,觸發(fā)器組名) * * @param sched * 調(diào)度器 * @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: 修改一個任務的觸發(fā)時間 * * @param sched * 調(diào)度器 * * @param sched * 調(diào)度器 * @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); // 重啟觸發(fā)器 sched.resumeTrigger(triggerName, triggerGroupName); } } catch (Exception e) { throw new RuntimeException(e); } } /** * @Description: 移除一個任務(使用默認的任務組名,觸發(fā)器名,觸發(fā)器組名) * * @param sched * 調(diào)度器 * @param jobName * * @Title: QuartzManager.java */ public static void removeJob(Scheduler sched, String jobName) { try { sched.pauseTrigger(jobName, TRIGGER_GROUP_NAME);// 停止觸發(fā)器 sched.unscheduleJob(jobName, TRIGGER_GROUP_NAME);// 移除觸發(fā)器 sched.deleteJob(jobName, JOB_GROUP_NAME);// 刪除任務 } catch (Exception e) { throw new RuntimeException(e); } } /** * @Description: 移除一個任務 * * @param sched * 調(diào)度器 * @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);// 停止觸發(fā)器 sched.unscheduleJob(triggerName, triggerGroupName);// 移除觸發(fā)器 sched.deleteJob(jobName, jobGroupName);// 刪除任務 } catch (Exception e) { throw new RuntimeException(e); } } /** * @Description:啟動所有定時任務 * * @param sched * 調(diào)度器 * * @Title: QuartzManager.java */ public static void startJobs(Scheduler sched) { try { sched.start(); } catch (Exception e) { throw new RuntimeException(e); } } /** * @Description:關閉所有定時任務 * * * @param sched * 調(diào)度器 * * * @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 = "動態(tài)任務調(diào)度"; System.out.println("【系統(tǒng)啟動】開始(每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層代碼中實現(xiàn)定時器管理
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
- Springboot集成定時器和多線程異步處理操作
- Spring Boot定時器創(chuàng)建及使用解析
- Spring Boot 2 整合 QuartJob 實現(xiàn)定時器實時管理功能
- SpringBoot集成ElaticJob定時器的實現(xiàn)代碼
- SpringBoot 動態(tài)定時器的使用方法
- 使用spring整合Quartz實現(xiàn)—定時器功能
- 詳解spring batch的使用和定時器Quart的使用
- 關于spring中定時器的使用教程
- java Quartz定時器任務與Spring task定時的幾種實現(xiàn)方法
- Java中Spring使用Quartz任務調(diào)度定時器
- JAVA中 Spring定時器的兩種實現(xiàn)方式
- 淺析spring定時器的使用
相關文章
詳解JAVA抓取網(wǎng)頁的圖片,JAVA利用正則表達式抓取網(wǎng)站圖片
這篇文章主要介紹了詳解JAVA抓取網(wǎng)頁的圖片,JAVA利用正則表達式抓取網(wǎng)站圖片,非常具有實用價值,需要的朋友可以參考下。2016-12-12springboot多環(huán)境(dev、test、prod)配置詳解
這篇文章主要介紹了springboot多環(huán)境(dev、test、prod)配置詳解,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-04-04詳解Idea SpringBoot搭建SpringCloud的準備工作(推薦)
這篇文章主要介紹了Idea SpringBoot搭建SpringCloud的準備工作(推薦),本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-10-10SpringBoot項目中jar發(fā)布獲取jar包所在目錄路徑的最佳方法
在開發(fā)過程中,我們經(jīng)常要遇到上傳圖片、word、pdf等功能,但是當我們把項目打包發(fā)布到服務器上時,對應的很多存儲路徑的方法就會失效,下面這篇文章主要給大家介紹了關于SpringBoot項目中jar發(fā)布獲取jar包所在目錄路徑的相關資料2022-07-07Springboot整合MongoDB進行CRUD操作的兩種方式(實例代碼詳解)
這篇文章主要介紹了Springboot整合MongoDB進行CRUD操作的兩種方式,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-04-04