- 浏览: 285557 次
- 性别:
- 来自: 深圳
文章分类
最新评论
-
u011563440:
u011563440 写道用反射A.class.toGener ...
Java接口中的内部接口和接口中的内部类 -
u011563440:
用反射A.class.toGenericString()--- ...
Java接口中的内部接口和接口中的内部类 -
narutolby:
因为接口本身不能实例化,所以在new 一个 接口的内部类时默认 ...
Java接口中的内部接口和接口中的内部类 -
hekuilove:
请问楼主,第四部如何做?在eclipse哪个位置?
eclipse中使用maven插件的问题:Updating index central|http://repo1.maven.org/maven2 -
小小生:
请问下,如果修改了数据库里面的订单任务的时间,那么不是要重启? ...
利用Spring动态对Quartz定时任务管理
转:http://www.iteye.com/topic/117244
Quartz 是一个强大的企业级 Schedule 工具,也是目前最好的开源 Schedule 工具。Spring中也集成了quartz的应用,下面就讲一下如何在spring中使用quartz。
spring的配置:
xml 代码
<bean id="schedulerFactoryBean" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref bean="simpleTrigger"/>
<ref bean="cornTrigger"/>
</list>
</property>
</bean>
<bean id="schedulerControl" class="com.pheh.scheduler.Schedule">
<property name="scheduler">
<ref bean="schedulerFactoryBean"/>
</property>
</bean>
<bean id="simpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean">
<property name="jobDetail">
<ref bean="methodInvokingJobDetail"/>
</property>
<property name="startDelay">
<value>1000</value>
</property>
<property name="repeatInterval">
<value>3000</value>
</property>
</bean>
<bean id="cornTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="jobDetail">
<ref bean="methodInvokingJobDetail"/>
</property>
<property name="cronExpression">
<value>0 0 */1 * * ?</value>
</property>
</bean>
Job:
org.quartz.Job是一个接口,只定义了void execute(JobExecutionContext context)throws JobExecutionException;一个方法。当定时任务被触发后,系统会自动调用实现了该接口的方法。在spring中,org.springframework.scheduling.quartz.QuartzJobBean对其进行了封装,使用了Template Method模式。主要是为了在使用jobDataMap时更加方便。QuartzJobBean有两个方法,
public final void execute(JobExecutionContext context) throws JobExecutionException
Job接口中定义的,spring在该方法里进行了些处理,将jobDataMap中的值注入到该Job的实现者中
protected abstract void executeInternal(JobExecutionContext context) throws JobExecutionException
这是一个抽象方法,用户在扩展了QuartzJobBean后,要自己实现该方法,在其中添加相应的业务逻辑
JobDetail:
JobDetail描述了一个任务具体的信息。在Spring中,JobDetailBean对JobDetail进行了封装(继承了JobDetail)。
private String name;//名称
private String group = Scheduler.DEFAULT_GROUP;//组
private String description;//描述
private Class jobClass;//定时任务触发时,回调的class,该class要实现Job接口或继承QuartzJobBean
private JobDataMap jobDataMap;//该任务存储的数据,在回调的时候也可以使用
private boolean volatility = false;//是否持久化到org.quartz.spi.JobStore中
private boolean durability = false;//当该任务完成后,是否还在JobStore中继续保留该任务
private boolean shouldRecover = false;//当系统重新启动后,是否再次执行该任务
对于jobDataMap,它是是一个封装过的Map,使用方法同Map,如
jobDetailBean.getJobDataMap().put(target,value);
如果使用了QuartzJobBean,在使用jobDetailBean时,可将target的值设成QuartzJobBean的子类的属性名称,这样,在定时触发时,spring会自动将与target对应的value值注入到QuartzJobBean的子类中去。如。
java 代码
...
public class ReminderManager extends QuartzJobBean{
private String reminderStr = "";
}
...
jobDetailBean.getJobDataMap().put(reminderStr,"abcdefg");
...
这样当该任务被触发后,在ReminderManager中,reminderStr的值就会被注入为"abcdefg"。
Trigger:
trigger就是触发器。Quartz有个很好的想法就是分离了任务和任务执行的条件。Trigger就是控制任务执行条件的类,当Trigger认为执行条件满足的时刻,Trigger会通知相关的Job去执行。分离的好处是:
1.你可以为某个Job关联多个Trigger,其中任何一个条件满足都可以触发job执行,这样可以完成一些组合的高级触发条件
2.当Trigger失效后(比如:一个永远都不能满足的条件),你不必去声明一个新的job,代替的是你可以为job关联一个新的Trigger让job可以继续执行。
目前的Quartz实现中,存在两种Trigger,SimpleTrigger和CronTrigger,在spring中分别用SimpleTriggerBean和CronTriggerBean对其进行封装。SimpleTrigger是简单触发器,如从某日到某日,每个一定时间进行一次提醒,在这段时间内进行多少次提醒;CronTrigger是复杂触发器,用来执行calendar-like的任务,可设定一些复杂的触发规则,如每年的x月的第y个星期五,或是每个星期天的几点进行提醒。后面附加一个日常语义与cronTrigger的转化
Trigger
private String name;//名称
private String group = Scheduler.DEFAULT_GROUP;//组
private String jobName;//所关联的jobDetail的名称
private String jobGroup = Scheduler.DEFAULT_GROUP;//所关联的jobDetail的组
private String description;//描述
private JobDataMap jobDataMap;//该触发器存储的数据,在回调的时候也可以使用
private boolean volatility = false;//是否持久化到org.quartz.spi.JobStore中
SimpleTrigger
private Date startTime = null;//开始日期
private Date endTime = null;//结束日期
private Date nextFireTime = null;//下次的触发时间
private Date previousFireTime = null;//上次的触发时间
private int repeatCount = 0;//重复次数
private long repeatInterval = 0;//重复间隔
private int timesTriggered = 0;/已触发的次数
SimpleTriggerBean
private JobDetail jobDetail;//所关联的JobDetail,方便在配置文件中使用
CornTrigger
private CronExpression cronEx = null;//触发条件表达式,它有一个String型的setter
private Date startTime = null;//开始日期
private Date endTime = null;//结束日期
private Date nextFireTime = null;//下次的触发时间
private Date previousFireTime = null;//上次的触发时间
private transient TimeZone timeZone = null;//所在时区
CronTriggerBean
private JobDetail jobDetail;//所关联的JobDetail,方便在配置文件中使用
Scheduler的常用方法
添加一个定时任务:
Date scheduleJob(JobDetail jobDetail,Trigger trigger)
修改一个定时任务,主要是更改trigger:
Date rescheduleJob(String triggerName, String groupName, Trigger newTrigger)
删除一个定时任务,同时也会将于该jobDetail关联的trigger一并删除:
boolean deleteJob(String jobName,String jobGroup)
取得所有的jobDetail组
String[] getJobGroupNames()
取得某个group下的所有的jobDetail
String[] getJobNames(String groupName)
取得指定的jobDetail
JobDetail getJobDetail(String jobName, String jobGroup)
取得指定的jobDetail的所有的Trigger
Trigger[] getTriggersOfJob(String jobName, String groupName)
取得指定的Trigger
Trigger getTrigger(String triggerName, String triggerGroup)
Quartz的存储:
Quartz默认的是使用RAM存储所有的信息,但是这样的话,当我们重启服务器后,之前的所有的定时任务就全消失了。为了让服务器重启以后,我们的定时任务仍不丢失,我们可采用数据库持久化定时任务。
首先要先建立数据库,在quartz-1.6.0\docs\dbTables下,选择自己使用的数据库的sql脚本,建立相应的数据库表。
在WEB-INF下加一个quartz.properties。我们可以在 quartz-1.6.0\examples\example10 中找到该文件的样例
org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX #表明使用JDBC进行持久化
org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.StdJDBCDelegate
org.quartz.jobStore.useProperties = false
org.quartz.jobStore.dataSource = myDS
org.quartz.jobStore.tablePrefix = QRTZ_ #该值尽量不要改动,如改动,还要相应的修改sql脚本
org.quartz.jobStore.isClustered = false
org.quartz.dataSource.myDS.driver = net.sourceforge.jtds.jdbc.Driver
org.quartz.dataSource.myDS.URL = jdbc:jtds:sqlserver://192.168.1.101:1433/Northwind;autoReconnect=true
org.quartz.dataSource.myDS.user = sa
org.quartz.dataSource.myDS.password =
org.quartz.dataSource.myDS.maxConnections = 5
日常语义与cronTrigger的转化,以下setter,getter省略
java 代码
public class TDateRange{ private int startType = 2;//开始类型。默认的使用2表示使用开始日期 private Date startDate = new Date();//开始日期 private int endType = 0;//结束类型。0表示无结束时间;1表示重复n次后结束;2表示使用结束日期 private Date endDate = new Date();//结束日期 private int occurrences;//执行次数 } public class TFrequency{ //0:无重复提醒 //1:每every //2:每个工作日detail=1,2,3,4,5 //3:每every周后的星期detail日 //4:每every月的detail日 //5:每every月的第num1个星期num2 //6:每年num1月num2日 //7:每年every月的第num1个月的星期num2 private int type = 0;//频率类型 private int every = 0; private String detail = ""; private String num1 = ""; private String num2 = ""; } private String formatQuartzString(){ String quartzStr = ""; tiggernote=""; //秒 分 时 quartzStr = "0 "+this.dateRange.getStartDate().getMinutes()+" "+this.dateRange.getStartDate().getHours()+" "; switch(this.frequency.getType()){ case 0://无重复提醒 quartzStr += this.dateRange.getStartDate().getDate()+" "+(this.dateRange.getStartDate().getMonth()+1)+" ? "+(this.dateRange.getStartDate().getYear()+1900); tiggernote+="起始时间:"+quartzStr; break; case 1://每XX天提醒 quartzStr += "*/"+this.frequency.getEvery()+" * ? "; tiggernote+="每"+this.frequency.getEvery()+"提醒"; break; case 2://每个工作日detail=1,2,3,4,5 //quartzStr += "? * 2-6"; quartzStr ="0 */1 * * * ?"; //测试 tiggernote+="每个工作日1,2,3,4,5提醒"; break; case 3://每every周后的星期detail日 quartzStr += "? * "+this.frequency.getDetail()+"/"+this.frequency.getEvery(); tiggernote+="每"+this.frequency.getEvery()+"周星期"+this.frequency.getDetail()+"日"; break; case 4://每every个月的detail日 quartzStr += this.frequency.getDetail()+" */"+this.frequency.getEvery()+" ?"; tiggernote+="每"+this.frequency.getEvery()+"月"+this.frequency.getDetail()+"日"; break; case 5://每every个月的第num1个星期num2 quartzStr += "? */"+this.frequency.getEvery()+" "+this.frequency.getNum2(); //星期 if(Integer.valueOf(this.frequency.getNum1()).intValue()>0){ quartzStr += "#"+this.frequency.getNum1(); tiggernote+="每"+this.frequency.getEvery()+"月第"+this.frequency.getNum1()+"个星期"+this.frequency.getNum2()+"日"; }else{ quartzStr += "L"; tiggernote+="每"+this.frequency.getEvery()+"月星期"+this.frequency.getNum2(); } break; case 6://每年num1月num2日 quartzStr += this.frequency.getNum2()+" "+this.frequency.getNum1()+" ?"; tiggernote+="每年"+this.frequency.getNum1()+"月"+this.frequency.getNum2()+"日"; break; case 7://每年every月的第num1个星期num2 quartzStr += "? "+this.getFrequency().getEvery()+" "+this.getFrequency().getNum2(); //星期 if(Integer.valueOf(this.frequency.getNum1()).intValue()>0){ quartzStr += "#"+this.frequency.getNum1(); tiggernote+="每年"+this.getFrequency().getEvery()+"月的第"+this.frequency.getNum1()+"个星期"+this.getFrequency().getNum2()+"日"; }else{ quartzStr += "L"; tiggernote+="每年"+this.getFrequency().getEvery()+"月的"+this.getFrequency().getNum2()+"日"; } break; default : } log.debug("quartzStr="+quartzStr); return quartzStr; }
Scheduler:
Scheduler 是一个计划集,其中可以包含多个 JobDetail 和 Trigger 组成的计划任务。
在Quartz中,我们可以通过
SchedulerFactory scheduleFactory = new StdSchedulerFactory();
Scheduler scheduler = scheduleFactory.getScheduler();
来取得scheduler,通过调用scheduler.start()来启动quartz。
在spring中,org.springframework.scheduling.quartz.SchedulerFactoryBean是对Quartz的org.quartz.Scheduler的封装,通过上面的配置,在spring启动的时候,quartz就会跟随着启动,不需要再用scheduler.start()来启动。在spring中,如果要取得scheduler,可通过上面的配置文件那样,将SchedulerFactoryBean注入到schdeuler中。
------------------------------------------另一文章--------------------------------------------------------------
org.quartz.Scheduler 来控制任务
scheduler.start(); //开始任务
scheduler.shutdown(); //终止任务
你在SchedulerFactoryBean里面不配置触发器
然后在你要触发的事件里配置一个scheduler不就可以了吗
Scheduler sch = (Scheduler) context.getBean("...");
sch.scheduleJob(newJob..., newTrigger...);
发表评论
-
[转]servlet 和filter区别和servlet、filter、interceptor的执行顺序
2013-03-21 00:50 19801)servlet和filter的区别 ... -
struts1,struts2,spring mvc区别
2013-03-21 00:26 2021Struts1和Struts2的区别和对比:Action ... -
spring IOC容器实例化Bean的方式与RequestContextListener应用
2013-02-26 12:10 1139spring IOC容器实例化Bean的方式有: ... -
Spring连接各种数据库数据源
2012-06-11 11:01 12541. Oracle数据库数据源配置 <bean id= ... -
SpringSide代码规范
2010-11-09 15:59 1899前言 本文档反映的是SpringSide 团队的编码 ... -
spring 事务
2010-08-24 15:58 1425事务传播属性 Propag ... -
spring注解
2010-06-01 16:26 1237一. spring注解 1.准备工作(1)导入common ... -
Spring 2.5新特性-第二部分-Spring MVC中的新特性
2010-06-01 16:20 1247Spring 框架从创建伊始就 ... -
Spring+JPA工程
2010-05-20 14:32 1815JPA需要的jarhibernate-distribution ... -
生成Excel 和PDF报表
2010-05-20 12:04 2405HTML页面并不总是向用户显示数据输出的最好方式,有时候需要生 ... -
Quartz与Spring结合时如何动态更新Job的启动时间
2010-05-13 23:37 2300转:http://www.blogjava.net/fastz ... -
利用Spring动态对Quartz定时任务管理
2010-05-12 15:48 6326在开发时我们会常常遇到定时任务可以由客户进行管理在什么时候去执 ... -
Quartz在Spring中动态设置cronExpression (spring设置动态定时任务)
2010-05-12 15:42 1401什么是动态定时任务:是由客户制定生成的,服务端只知道该去执行什 ...
相关推荐
2025最新全国水利安全生产知识竞赛题库(含答案).docx
1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。
1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。
因为文件过大所以使用bz2进行了2次压缩,请解压成tar包后在上传到服务器
项目已获导师指导并通过的高分毕业设计项目,可作为课程设计和期末大作业,下载即用无需修改,项目完整确保可以运行。 包含:项目源码、数据库脚本、软件工具等,该项目可以作为毕设、课程设计使用,前后端代码都在里面。 该系统功能完善、界面美观、操作简单、功能齐全、管理便捷,具有很高的实际应用价值。 项目都经过严格调试,确保可以运行!可以放心下载 技术组成 语言:java 开发环境:idea 数据库:MySql8.0 部署环境:Tomcat(建议用 7.x 或者 8.x 版本),maven 数据库工具:navicat
iostat打印解析画图工具
1、文件内容:fence-agents-compute-4.2.1-41.el7_9.6.rpm以及相关依赖 2、文件形式:tar.gz压缩包 3、安装指令: #Step1、解压 tar -zxvf /mnt/data/output/fence-agents-compute-4.2.1-41.el7_9.6.tar.gz #Step2、进入解压后的目录,执行安装 sudo rpm -ivh *.rpm 4、安装指导:私信博主,全程指导安装
1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。
PDF格式,229页,包括有环保,新能源,木工,包装等行业的应用。适用于电气自动化行业。
1、文件内容:dropwatch-1.4-9.el7.rpm以及相关依赖 2、文件形式:tar.gz压缩包 3、安装指令: #Step1、解压 tar -zxvf /mnt/data/output/dropwatch-1.4-9.el7.tar.gz #Step2、进入解压后的目录,执行安装 sudo rpm -ivh *.rpm 4、安装指导:私信博主,全程指导安装
1、文件内容:fence-agents-emerson-4.2.1-41.el7_9.6.rpm以及相关依赖 2、文件形式:tar.gz压缩包 3、安装指令: #Step1、解压 tar -zxvf /mnt/data/output/fence-agents-emerson-4.2.1-41.el7_9.6.tar.gz #Step2、进入解压后的目录,执行安装 sudo rpm -ivh *.rpm 4、安装指导:私信博主,全程指导安装
航空发动机磨粒荷电特性研究.pdf
第十一届蓝桥杯大赛个人赛校内选拔(软件类)真题全面考察了参赛选手的编程与算法能力,涵盖多个热门编程语言,为选手提供了展现自身实力的舞台。 考察范围与方向 真题在编程语言上聚焦于 C/C++、Java、Python 等主流语言。考察内容广泛,既有基础的语法运用,也涉及复杂的数据结构和算法。数据结构方面,对数组、链表、栈、队列、哈希表等的使用有不同程度的考察;算法上,动态规划、贪心算法、搜索算法等经典算法是考察重点。 题型示例与特点 在具体题型上,有数值计算类题目,例如给定条件计算特定数值,要求选手有较强的逻辑思维和数学运算能力;字符串处理类题目,如字符串匹配、替换等,考验选手对字符串操作函数的熟悉程度;还有图论与搜索类题目,像最短路径问题,需要选手掌握相应的搜索算法。 考察目的与意义 这次校内选拔真题旨在筛选出编程能力强、算法思维敏捷的选手,为后续的正式比赛储备人才。通过解答这些真题,选手能发现自身知识短板,明确学习方向。对于学校而言,能了解学生的编程水平,为教学改进提供参考。同时,这也为学生提供了与同龄人交流切磋的机会,激发他们学习编程的热情,提升解决实际问题的能力。
一种采用耦合电感的开关电路分析.pdf
rancher-active-proxy
RSSIIndoorLocation-master
1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。
1、文件内容:exchange-bmc-os-info-1.8.18-11.el7_9.rpm以及相关依赖 2、文件形式:tar.gz压缩包 3、安装指令: #Step1、解压 tar -zxvf /mnt/data/output/exchange-bmc-os-info-1.8.18-11.el7_9.tar.gz #Step2、进入解压后的目录,执行安装 sudo rpm -ivh *.rpm 4、安装指导:私信博主,全程指导安装
项目已获导师指导并通过的高分毕业设计项目,可作为课程设计和期末大作业,下载即用无需修改,项目完整确保可以运行。 包含:项目源码、数据库脚本、软件工具等,该项目可以作为毕设、课程设计使用,前后端代码都在里面。 该系统功能完善、界面美观、操作简单、功能齐全、管理便捷,具有很高的实际应用价值。 项目都经过严格调试,确保可以运行!可以放心下载 技术组成 语言:java 开发环境:idea 数据库:MySql8.0 部署环境:Tomcat(建议用 7.x 或者 8.x 版本),maven 数据库工具:navicat
1、文件内容:docbook-style-xsl-1.78.1-3.el7.rpm以及相关依赖 2、文件形式:tar.gz压缩包 3、安装指令: #Step1、解压 tar -zxvf /mnt/data/output/docbook-style-xsl-1.78.1-3.el7.tar.gz #Step2、进入解压后的目录,执行安装 sudo rpm -ivh *.rpm 4、安装指导:私信博主,全程指导安装