您的位置:首页 > 运维架构 > Tomcat

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实例化就会自动调度任务
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: