- 浏览: 413742 次
- 性别:
- 来自: 广州
文章分类
最新评论
-
liyuanhoa_:
...
struts2.0中struts.xml配置文件详解 -
chenmingde:
...
Velocity应用(一) -
weizhikai_ai:
第二十六,当一个线程进入一个对象的一个synchronized ...
Java常见面试题(含答案) -
Aurora_lr:
...
Spring宠物商店学习笔记(一) - -
zs911zs:
all copy from http://www.iteye ...
Mule入门文档
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中。
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中。
发表评论
-
java关键字native,volatile,transient
2009-02-25 15:12 13661.volatile:为了获得最佳速度,java允许线程保存共 ... -
Java虚拟机(JVM)参数配置说明
2009-01-08 16:02 2596在Java、J2EE大型应用中,JVM非标准参数的配置直接关系 ... -
@SuppressWarnings 详解
2009-01-08 15:27 981@SuppressWarnings J2SE 提供的最后一个 ... -
批量反编译java类文件
2009-01-08 10:30 1564所使用的软件是 DJ Java Decompiler 3.7。 ... -
LDAP定义
2008-12-23 10:20 1182LDAP是轻量目录访问协议 ... -
JMS总结和参考资料
2008-12-22 17:33 1815结束语 第 1 页(共3 页) 本教程提供了对 Ja ... -
JMS--Pub/Sub编程
2008-12-22 17:27 1090相同又不同 第 1 页(共1 页) 附录中有这两个 ... -
JMS--Pub/Sub接口
2008-12-22 17:24 1888介绍 第 1 页(共7 页) 现在让我们来查看 Pub/s ... -
JMS点对点编程
2008-12-22 17:15 1634介绍 第 1 页(共10 页) ... -
JMS点对点接口
2008-12-22 17:03 1485介绍 第 1 页(共8 页) ... -
JMS用公用接口进行客户机编程
2008-12-22 17:01 968绍 第 1 页(共11 页) 在这一节中,我们将查看 ... -
JMS公用接口
2008-12-19 18:01 1073在这一节中,我们将介绍 JMS 客户机编程的每一个重要 JMS ... -
JMS学习教程概述
2008-12-19 17:55 3122应用程序 第 1 页(共15 页) http://liy ... -
JNDI定义
2008-12-19 09:56 1052Java术语 英文全称是:Java Naming and ... -
Java 编程的动态性,第 8 部分: 用代码生成取代反射
2008-12-18 11:52 1000运行时代码生成为获得 ... -
Java 编程的动态性,第 7 部分: 用 BCEL 设计字节码
2008-12-18 11:51 1252Apache BCEL 让您深入 JVM 汇编语言进行类操作的 ... -
Java 编程的动态性,第 6 部分: 利用 Javassist 进行面向方面的更改
2008-12-18 11:50 1124用 Javassist 进行字节码 ... -
Java 编程的动态性,第 5 部分: 动态转换类
2008-12-18 11:48 1052学习如何在使用 Javassist ... -
Java 编程的动态性, 第四部分: 用 Javassist 进行类转换
2008-12-18 11:47 1050用 Javassist 转换字节码中的方法 文档 ... -
Java 编程的动态性,第3部分: 应用反射
2008-12-18 11:18 831为命令行参数构建一个框架 文档选项 打印本 ...
相关推荐
Quartz和Spring结合使用可以构建强大的定时任务管理系统。Quartz是一个开源的作业调度框架,它允许应用程序定义和调度任务在特定时间执行。而Spring框架则提供了丰富的依赖注入和管理功能,使得集成Quartz变得更加...
将 Quartz 整合到 Spring 中,可以方便地管理和控制定时任务,使得应用更具灵活性。 **1. 添加依赖** 首先,我们需要在项目中引入 Quartz 和 Spring 的相关依赖。如果是 Maven 项目,可以在 `pom.xml` 文件中添加...
"Quartz+springjar" 提供的 jar 文件很可能是为了帮助开发者快速搭建一个能够结合 Quartz 和 Spring 的环境。 Quartz 的核心概念包括: 1. **Job**:这是执行的任务,实现 `org.quartz.Job` 接口。Job 不包含任何...
在 "Quartz+spring定时任务demo" 中,我们首先需要了解如何配置和集成 Quartz 与 Spring。这通常包括以下步骤: 1. **引入依赖**:在项目中添加 Quartz 和 Spring 相关的 jar 包。描述中提到的 "1128266338845696....
Quartz + spring简单配置多个任务调度 spring配置文件 简单配置
Quartz和Spring是两个在Java开发中非常重要的框架。Quartz是一个开源的作业调度库,它允许应用程序在预定义的时间执行任务,而Spring是一个全面的Java应用开发框架,提供了依赖注入、面向切面编程以及一系列的企业级...
将Quartz与Spring结合使用,可以方便地在Spring应用程序中进行定时任务的管理。 在“quartz+spring分布式集群”场景下,我们可以实现跨多个节点的作业调度,从而提高系统的可扩展性和可靠性。JDBC-JobStore是Quartz...
本文将深入探讨如何在分布式环境中利用Quartz和Spring构建一个高可用的集群调度系统。 一、Quartz简介 Quartz是Java平台上的作业调度库,它可以被用来创建、调度和执行计划任务。Quartz的核心是Job和Trigger。Job...
Quartz和Spring集成的定时任务框架是Java应用中常见的任务调度解决方案。Quartz是一个开源的作业调度库,能够创建、调度和执行作业,而Spring框架则提供了强大的依赖注入(DI)和面向切面编程(AOP)功能。将两者...
Quartz 是一个开源的任务调度框架,它允许程序在指定的时间执行特定任务,而Spring 是一个广泛应用的Java企业级应用框架,提供了丰富的功能,包括依赖注入、面向切面编程以及全面的事务管理等。将 Quartz 与 Spring ...
Quartz和Spring Batch是两种非常重要的Java开源框架,它们在企业级应用开发中扮演着重要角色。Quartz主要用于任务调度,而Spring Batch则专注于批量处理。在这个“quartz_springbatch_dynamic”项目中,我们将看到...
本教程将深入探讨如何使用Quartz与Spring框架结合来创建一个能从数据库读取配置的定时任务。 Quartz是一个开源的作业调度框架,它提供了丰富的API和功能,可以用来安排和执行任务。Spring框架则是一个全面的企业级...
这是一个基于Spring Boot、Apache Shiro、Spring MVC、MyBatis、Quartz和Druid的数据源管理框架的示例项目,名为"renren-security"。这个DEMO提供了完整的权限管理和任务调度解决方案,下面是这些技术栈的核心知识点...
Quartz和Spring是两个在Java开发中非常重要的框架。Quartz是一个开源的作业调度框架,它允许开发者创建、调度和管理任务,而Spring是一个全面的企业级应用开发框架,提供了依赖注入、面向切面编程以及丰富的模块,如...
springtask 和 quartz +ssh简单示例springtask 和 quartz +ssh简单示例springtask 和 quartz +ssh简单示例springtask 和 quartz +ssh简单示例
以SpringBoot 为中心,模块化开发系统,用户可以随意删减除权限...复用,组装性强主要应用技术:spring Security+Ehcache+quartz+swagger2+Mysql5.6+springjdbc+druid+spring social+spring session + layerui+vue.js
Quartz和Spring是两个在Java开发中非常重要的框架,它们结合使用可以实现强大的任务调度功能。Quartz是一个开源的工作调度库,它允许开发者创建、调度和管理后台任务,而Spring框架则是一个全方位的应用开发框架,...
【标题】"Spring+Quartz+Maven项目实例"是一个基于Spring框架集成Quartz作业调度库的实战项目,采用Maven作为构建工具。这个实例旨在展示如何在Java应用程序中实现定时任务,支持两种运行模式,既可以直接以独立的...