-
...
-
publicclassReminderManagerextendsQuartzJobBean{
-
privateStringreminderStr="";
-
}
-
...
-
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 代码
-
publicclassTDateRange{
-
privateintstartType=2;//开始类型。默认的使用2表示使用开始日期
-
privateDatestartDate=newDate();//开始日期
-
privateintendType=0;//结束类型。0表示无结束时间;1表示重复n次后结束;2表示使用结束日期
-
privateDateendDate=newDate();//结束日期
-
privateintoccurrences;//执行次数
-
}
-
publicclassTFrequency{
-
//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
-
privateinttype=0;//频率类型
-
privateintevery=0;
-
privateStringdetail="";
-
privateStringnum1="";
-
privateStringnum2="";
-
}
-
-
privateStringformatQuartzString(){
-
StringquartzStr="";
-
tiggernote="";
-
//秒分时
-
quartzStr="0"+this.dateRange.getStartDate().getMinutes()+""+this.dateRange.getStartDate().getHours()+"";
-
switch(this.frequency.getType()){
-
case0://无重复提醒
-
quartzStr+=this.dateRange.getStartDate().getDate()+""+(this.dateRange.getStartDate().getMonth()+1)+"?"+(this.dateRange.getStartDate().getYear()+1900);
-
tiggernote+="起始时间:"+quartzStr;
-
break;
-
case1://每XX天提醒
-
quartzStr+="*/"+this.frequency.getEvery()+"*?";
-
tiggernote+="每"+this.frequency.getEvery()+"提醒";
-
break;
-
case2://每个工作日detail=1,2,3,4,5
-
//quartzStr+="?*2-6";
-
quartzStr="0*/1***?";//测试
-
tiggernote+="每个工作日1,2,3,4,5提醒";
-
break;
-
case3://每every周后的星期detail日
-
quartzStr+="?*"+this.frequency.getDetail()+"/"+this.frequency.getEvery();
-
tiggernote+="每"+this.frequency.getEvery()+"周星期"+this.frequency.getDetail()+"日";
-
break;
-
case4://每every个月的detail日
-
quartzStr+=this.frequency.getDetail()+"*/"+this.frequency.getEvery()+"?";
-
tiggernote+="每"+this.frequency.getEvery()+"月"+this.frequency.getDetail()+"日";
-
break;
-
case5://每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;
-
case6://每年num1月num2日
-
quartzStr+=this.frequency.getNum2()+""+this.frequency.getNum1()+"?";
-
tiggernote+="每年"+this.frequency.getNum1()+"月"+this.frequency.getNum2()+"日";
-
break;
-
case7://每年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);
-
returnquartzStr;
- }
相关推荐
spring 定时器 内含TimerTask实现和Quartz实现两种方式
spring定时器两种实现方式 ,Spring quartz java 定时器 定时任务
spring定时器Spring定时器的两种实现方式Java的Timer类和OpenSymphony的Quartz。
使用spring 实现的两种定时任务,使用eclipse直接导入就可使用
本文向您介绍Spring定时器的两种实现方式,包括Java Timer定时和Quartz定时器,两种Spring定时器的实现方式各有优点,可结合具体项目考虑是否采用。
定时器的配置文件(两种方式:springmvc自带定时,Quartz与spring结合的定时)
Spring两种定时器实例配置:Java的TimerTask类和OpenSymphony的Quartz。包含5种配置方式:timer普通定时器、timer特定方法定时器、quartz简单定时器、quartz精确定时器、quartz特定方法定时器。简单实用,一看就会。
并非应用系统中发生的所有事情都是由用户的动作引起的。...在Spring中有两种流行配置:Java的Timer类和OpenSymphony的Quartz来执行调度任务。下面以给商丘做的接口集抄900到中间库的日冻结数据传输为例:
本代码是定时器的实例,两种运行模式,一种是直接以Java程序的形式运行,指定加载的配置文件;另一种是在tomcat下运行
Spring自带了一套定时任务工具Spring-Task,可以把它看成是一个轻量级的Quartz,使用起来十分简单,除Spring相关的包外不需要额外的包,支持注解和配置文件两种形式。通常情况下在Spring体系内,针对简单的定时任务...
群发or单独 发送短信,支持两种第三方短信商接口 6. spring aop 事物处理 7. 代码生成器 (freemarker), 代码 zip 压缩打包 8. MD5加密 SHA加密(登录密码用此加密) 9. 数据库连接池 阿里的 druid。Druid在监控、...
在工作中有用到spring task作为定时任务的处理,spring通过接口TaskExecutor和TaskScheduler这两个接口的方式为异步定时任务提供了一种抽象。这就意味着spring容许你使用其他的定时任务框架,当然spring自身也提供了...
群发or单独 发送短信,支持两种第三方短信商接口 6. spring aop 事物处理 7. 代码生成器 (freemarker), 代码 zip 压缩打包 8. MD5加密 SHA加密(登录密码用此加密) 9. 数据库连接池 阿里的 druid。Druid在监控、...