Tomcat服务器中使用java定时调度Quartz
2014-05-13 16:11
323 查看
利用Quartz组件实现java定时调度
Quartz的cron表达式:顺序为秒、分、时、天、月、星期、年,其中。秒为0~59,分为0~59,时为0~23,天为每个月的天数,月为0~11,星期为1~7(1=sun或sun、mon、tue、wed、thu、fri、sat),年份为1970~2099;其中每个元素可以是一个值(如6),一个连续的区间(如9-12),一个间隔时间(8-18/4:每隔4小时),一个列表(1,3,5),通配符。由于“月份中的日期”和“星期中的日期”这两个元素互斥,必须要对其中一个置为“?”
如: (秒 分 时 天 月 星期 年)
0 0 10,14,16 * * ?:表示每天上午10点、下午2点、下午4点
0 0/30 9-17 * * ?:表示早上9点到下午五点的从0到30分钟的半小时内
0 0 12 ? * wed:表示每个星期的星期三中午12点
有些表达式能包含一些范围或列表,如:字表达式(天(星期))可以为:“mon-fri”,“mon,wed,fri”, “mon-wed, sat”
通配符的使用:
*:在月表达式中表示每个月的含义,在每个星期中表达一个星期的每一天
?:因为每个月的某一天不能确定是星期几,故在使用具体月的天值时星期使用?表示,避免错误
/:用来指定数值的增量值,如:在字表达式(分钟)里0/15表示从第0分钟开始,每15分钟调度一次;3/20表示从第3分钟开始,每20分钟调度一次,和表达式3,23,43一样的含义
L:字符仅被用于月和星期两个子表达式,它的单词为“Last”的缩写,但含义不同;在月表达式中L表示一个月的最后一天;在星期表达式中表示一个星期的最后一天即星期六sat,若L前面还有具体数字,则数字表示倒数第几,如:6L表示这个月的倒数第6天,FIRL表示这个月的最后一个星期五,其中,使用L时不能用于指定列表或范围
Quartz组件时opensymphony提供的一款定时任务调度组件。
1、Quartz组件和Spring整合使用:(Quartz开发包引入后)
首先,定义一个javabean组件,封装要执行的任务逻辑,在Spring配置文件中配置Quartz调度工厂javabean
//定义javabean组件
public class MyTask{
private SessionFactory sf;//需要注入的变量
public void setSf(SessionFactory sf){
this.sf = sf;
}
public void myrun(){
//任务逻辑:打印当前系统时间
System.out.println(new Date());
//若需要调用使用PL/SQL定义的存储过程
//利用sessionFactory获取Session会话
Session session = sf.openSession();
//利用SQLQuery执行存储过程:GBILL_ALL(),存储过程的定义见博客“存储过程定义”
SQLQuery query = session.createSQLQuery("{call GBILL_ALL()}");
query.executeUpdate();
session.close();
}
}
2、在Spring配置文件中添加Quartz调度工厂bean,使用Quartz组件周期调用javabean组件,步骤为:
添加配置文件:(利用Quarta定时调用MyTask)
<beans>
<!--将javabean组件定位为bean组件-->
<bean id="myTaskBean" class="MyTask">
<property name="sf" ref="sessionFactory"></property>
</bean>
<!--定义Quartz元素-->
<!--将myTask定义成Quartz中的task-->
<bean id="task1" class="org.springframework.scheduling.quartz..MethodInvokingJobDetailFactoryBean">
<property name="taskObject" ref="myTask">
<property name="taskMethod" ref="myrun"/>
</bean>
<!--定义触发时机-->
<bean id="taskTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
<!--指定task任务-->
<property name="jobDetail">
<ref bean="task1"/>
</property>
<!--指定task任务的触发时机,表达式从第0秒开始每个2秒就调度一次-->
<property name="cronExpression" value="0/2 * * * * ?"></property>
</bean>
<!--将taskTrigger交给Quartz调度工厂调度-->
<bean id="triggerFactory" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref bean ="taskTrigger"/>
</list>
</property>
</bean>
</beans>
注意:避免jar包版本冲突,去掉commons-collections.jar低版本重复的jar包,当启动tomcat服务器时,实例化Spring容器对象,此时triggerFactory由于是单例模式,也会随着Spring容器实例化,triggerFactory实例化就会自动调度任务
Quartz的cron表达式:顺序为秒、分、时、天、月、星期、年,其中。秒为0~59,分为0~59,时为0~23,天为每个月的天数,月为0~11,星期为1~7(1=sun或sun、mon、tue、wed、thu、fri、sat),年份为1970~2099;其中每个元素可以是一个值(如6),一个连续的区间(如9-12),一个间隔时间(8-18/4:每隔4小时),一个列表(1,3,5),通配符。由于“月份中的日期”和“星期中的日期”这两个元素互斥,必须要对其中一个置为“?”
如: (秒 分 时 天 月 星期 年)
0 0 10,14,16 * * ?:表示每天上午10点、下午2点、下午4点
0 0/30 9-17 * * ?:表示早上9点到下午五点的从0到30分钟的半小时内
0 0 12 ? * wed:表示每个星期的星期三中午12点
有些表达式能包含一些范围或列表,如:字表达式(天(星期))可以为:“mon-fri”,“mon,wed,fri”, “mon-wed, sat”
通配符的使用:
*:在月表达式中表示每个月的含义,在每个星期中表达一个星期的每一天
?:因为每个月的某一天不能确定是星期几,故在使用具体月的天值时星期使用?表示,避免错误
/:用来指定数值的增量值,如:在字表达式(分钟)里0/15表示从第0分钟开始,每15分钟调度一次;3/20表示从第3分钟开始,每20分钟调度一次,和表达式3,23,43一样的含义
L:字符仅被用于月和星期两个子表达式,它的单词为“Last”的缩写,但含义不同;在月表达式中L表示一个月的最后一天;在星期表达式中表示一个星期的最后一天即星期六sat,若L前面还有具体数字,则数字表示倒数第几,如:6L表示这个月的倒数第6天,FIRL表示这个月的最后一个星期五,其中,使用L时不能用于指定列表或范围
Quartz组件时opensymphony提供的一款定时任务调度组件。
1、Quartz组件和Spring整合使用:(Quartz开发包引入后)
首先,定义一个javabean组件,封装要执行的任务逻辑,在Spring配置文件中配置Quartz调度工厂javabean
//定义javabean组件
public class MyTask{
private SessionFactory sf;//需要注入的变量
public void setSf(SessionFactory sf){
this.sf = sf;
}
public void myrun(){
//任务逻辑:打印当前系统时间
System.out.println(new Date());
//若需要调用使用PL/SQL定义的存储过程
//利用sessionFactory获取Session会话
Session session = sf.openSession();
//利用SQLQuery执行存储过程:GBILL_ALL(),存储过程的定义见博客“存储过程定义”
SQLQuery query = session.createSQLQuery("{call GBILL_ALL()}");
query.executeUpdate();
session.close();
}
}
2、在Spring配置文件中添加Quartz调度工厂bean,使用Quartz组件周期调用javabean组件,步骤为:
添加配置文件:(利用Quarta定时调用MyTask)
<beans>
<!--将javabean组件定位为bean组件-->
<bean id="myTaskBean" class="MyTask">
<property name="sf" ref="sessionFactory"></property>
</bean>
<!--定义Quartz元素-->
<!--将myTask定义成Quartz中的task-->
<bean id="task1" class="org.springframework.scheduling.quartz..MethodInvokingJobDetailFactoryBean">
<property name="taskObject" ref="myTask">
<property name="taskMethod" ref="myrun"/>
</bean>
<!--定义触发时机-->
<bean id="taskTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
<!--指定task任务-->
<property name="jobDetail">
<ref bean="task1"/>
</property>
<!--指定task任务的触发时机,表达式从第0秒开始每个2秒就调度一次-->
<property name="cronExpression" value="0/2 * * * * ?"></property>
</bean>
<!--将taskTrigger交给Quartz调度工厂调度-->
<bean id="triggerFactory" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref bean ="taskTrigger"/>
</list>
</property>
</bean>
</beans>
注意:避免jar包版本冲突,去掉commons-collections.jar低版本重复的jar包,当启动tomcat服务器时,实例化Spring容器对象,此时triggerFactory由于是单例模式,也会随着Spring容器实例化,triggerFactory实例化就会自动调度任务
相关文章推荐
- Java任务调度框架Quartz入门教程指南(二) 使用job、trigger、schedule调用定时任务
- java定时调度器(Quartz)使用实例
- JAVA定时调度框架Quartz使用案例
- (转)Java任务调度框架Quartz入门教程指南(二) 使用job、trigger、schedule调用定时任务
- [译]Java定时任务调度-Quartz文档(一)初步使用
- Java使用quartz实现作业调度
- [译]Java定时任务调度-Quartz文档(十一)Advanced (Enterprise) Features
- 使用Spring(17)Spring中的定时调度(Scheduling)--传统方式创建Quartz任务
- [JAVA]定时任务之-Quartz使用篇
- Linux下使用Tomcat7搭建高性能Java服务器
- Java定时任务调度工具详解(4)— Quartz 之 Job/JobDetail/JobExecutionContext/JobDataMap
- 关于Java Web 使用Spring中使用Quartz(定时调用、实现固定时间执行), 触发定时器(执行某些任务)的实例
- Java定时任务调度工具详解(7)— Quartz 之 Scheduler
- Java的作业调度类库Quartz基本使用指南
- JAVA 定时任务之-Quartz使用篇
- Java作业调度/定时任务 Spring和Quartz整合
- Java定时任务调度工具详解(3)— Quartz 简介
- [JAVA]定时任务之-Quartz使用篇
- java 多线程——quartz 定时调度的例子