Spring整合Quartz实现动态定时器的示例代码
程序员文章站
2024-03-07 21:19:57
一、版本说明
spring3.1以下的版本必须使用quartz1.x系列,3.1以上的版本才支持quartz 2.x,不然会出错。
原因:spring对于quartz的...
一、版本说明
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层代码中实现定时器管理
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
推荐阅读
-
Spring整合Quartz实现动态定时器的示例代码
-
spring整合redis实现数据缓存的实例代码
-
Springboot整个Quartz实现动态定时任务的示例代码
-
使用Spring Data JDBC实现DDD聚合的示例代码
-
java Quartz定时器任务与Spring task定时的几种实现方法
-
详解Spring整合Quartz实现动态定时任务
-
用java的spring实现一个简单的IOC容器示例代码
-
java Quartz定时器任务与Spring task定时的几种实现方法
-
详解Spring整合Quartz实现动态定时任务
-
Spring Boot整合Mybatis并完成CRUD操作的实现示例