zoukankan      html  css  js  c++  java
  • spring+quartz的任务调度

    公司网站有个功能是自动投标,还有定时更新用户的排名信息,这些都是spring+quartz实现的。

    手机了一些资料,做一个小demo,加深理解,记录一下,以后使用的时候不会出什么问题。

    需要的包,主要是spring的包(spring-context-support必要的),还有slf4j-api.jar、slf4j-log4j-xxx.jar这两个包。

    测试类:

    package test;
    
    import java.util.Date;
    
    public class QuartzTest {
        public void work(){
            System.out.println("date1:" + new Date().toString()); 
        }
    
    }

    web.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
      <display-name>QuartzTest</display-name>
      <welcome-file-list>
        <welcome-file>index.html</welcome-file>
        <welcome-file>index.htm</welcome-file>
        <welcome-file>index.jsp</welcome-file>
        <welcome-file>default.html</welcome-file>
        <welcome-file>default.htm</welcome-file>
        <welcome-file>default.jsp</welcome-file>
      </welcome-file-list>
      
      
      <!-- Spring config start -->  
        <context-param>  
            <param-name>contextConfigLocation</param-name>  
            <param-value>/WEB-INF/classes/applicationContext.xml</param-value>  
        </context-param> 
        <listener>  
            <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>  
        </listener> 
        <!-- Spring config end --> 
    </web-app>


    applicationContext.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:context="http://www.springframework.org/schema/context"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
        xmlns:tx="http://www.springframework.org/schema/tx"
        xsi:schemaLocation="
        http://www.springframework.org/schema/beans 
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/tx
        http://www.springframework.org/schema/tx/spring-tx.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop-2.0.xsd">
        
            <!-- 工作的bean -->  
        <bean id="myJob" class="test.QuartzTest" /> 
       
       <!-- job的配置开始 -->  
        <bean id="myJobDetail"  
            class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">  
            <property name="targetObject">  
                <ref bean="myJob" />  
            </property>  
            <property name="targetMethod">  
                <value>work</value>  
            </property>  
        </bean>  
        <!-- job的配置结束 -->  
        
        <!-- 调度的配置开始  quartz-1.8以前的配置  -->  <!--  还有一个2.0以后的配置,class不同 -->     
        <bean id="myJobTrigger"  
            class="org.springframework.scheduling.quartz.CronTriggerBean">  
            <property name="jobDetail">  
                <ref bean="myJobDetail" />  
            </property>  
            <property name="cronExpression">  
                <value>0/5 * * * * ?</value>  
            </property>  
        </bean> 
         <!-- 调度的配置结束 -->  
        
        <!-- 启动触发器的配置开始 -->  
        <bean name="startQuertz" lazy-init="false" autowire="no"  
            class="org.springframework.scheduling.quartz.SchedulerFactoryBean">  
            <property name="triggers">  
                <list>  
                    <ref bean="myJobTrigger" />  
                </list>  
            </property>  
        </bean>  
        <!-- 启动触发器的配置结束 --> 
           
    </beans>

    主方法:

    package test;
    
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    
    public class Test {
    
        /**
         * @param args
         */
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            new ClassPathXmlApplicationContext("applicationContext.xml");
        }
    }

    结果如下:

    date1:Fri Jun 13 04:53:45 BRT 2014
    date1:Fri Jun 13 04:53:50 BRT 2014
    date1:Fri Jun 13 04:53:55 BRT 2014
    date1:Fri Jun 13 04:54:00 BRT 2014
    date1:Fri Jun 13 04:54:05 BRT 2014
    date1:Fri Jun 13 04:54:10 BRT 2014
    date1:Fri Jun 13 04:54:15 BRT 2014
    。。。

     附cron表达式:

    关于cron表达式(来自网络):

    Cron 表达式包括以下 7 个字段:

    • 小时
    • 月内日期
    • 周内日期
    • 年(可选字段)

    特殊字符

    Cron 触发器利用一系列特殊字符,如下所示:

    • 反斜线(/)字符表示增量值。例如,在秒字段中“5/15”代表从第 5 秒开始,每 15 秒一次。

    • 问号(?)字符和字母 L 字符只有在月内日期和周内日期字段中可用。问号表示这个字段不包含具体值。所以,如果指定月内日期,可以在周内日期字段中插入“?”,表示周内日期值无关紧要。字母 L 字符是 last 的缩写。放在月内日期字段中,表示安排在当月最后一天执行。在周内日期字段中,如果“L”单独存在,就等于“7”,否则代表当月内周内日期的最后一个实例。所以“0L”表示安排在当月的最后一个星期日执行。

    • 在月内日期字段中的字母(W)字符把执行安排在最靠近指定值的工作日。把“1W”放在月内日期字段中,表示把执行安排在当月的第一个工作日内。

    • 井号(#)字符为给定月份指定具体的工作日实例。把“MON#2”放在周内日期字段中,表示把任务安排在当月的第二个星期一。

    • 星号(*)字符是通配字符,表示该字段可以接受任何可能的值。

    字段 允许值 允许的特殊字符
    秒 0-59 , - * /
    分 0-59 , - * /
    小时 0-23 , - * /
    日期 1-31 , - * ? / L W C
    月份 1-12 或者 JAN-DEC , - * /
    星期 1-7 或者 SUN-SAT , - * ? / L C #
    年(可选) 留空, 1970-2099 , - * /

    表达式意义
    "0 0 12 * * ?" 每天中午12点触发
    "0 15 10 ? * *" 每天上午10:15触发
    "0 15 10 * * ?" 每天上午10:15触发
    "0 15 10 * * ? *" 每天上午10:15触发
    "0 15 10 * * ? 2005" 2005年的每天上午10:15触发
    "0 * 14 * * ?" 在每天下午2点到下午2:59期间的每1分钟触发
    "0 0/5 14 * * ?" 在每天下午2点到下午2:55期间的每5分钟触发
    "0 0/5 14,18 * * ?" 在每天下午2点到2:55期间和下午6点到6:55期间的每5分钟触发
    "0 0-5 14 * * ?" 在每天下午2点到下午2:05期间的每1分钟触发
    "0 10,44 14 ? 3 WED" 每年三月的星期三的下午2:10和2:44触发
    "0 15 10 ? * MON-FRI" 周一至周五的上午10:15触发
    "0 15 10 15 * ?" 每月15日上午10:15触发
    "0 15 10 L * ?" 每月最后一日的上午10:15触发
    "0 15 10 ? * 6L" 每月的最后一个星期五上午10:15触发
    "0 15 10 ? * 6L 2002-2005" 2002年至2005年的每月的最后一个星期五上午10:15触发
    "0 15 10 ? * 6#3" 每月的第三个星期五上午10:15触发
    每天早上6点

    0 6 * * *

    每两个小时

    0 */2 * * *
    晚上11点到早上8点之间每两个小时,早上八点

    0 23-7/2,8 * * *

    每个月的4号和每个礼拜的礼拜一到礼拜三的早上11点

    0 11 4 * 1-3
    1月1日早上4点

    0 4 1 1 *

  • 相关阅读:
    Python常用函数
    MySQL常用操作
    Python与JAVA的异同
    token
    用户cookie和会话session、sessionID的关系
    Jenkins应用
    Python3 logging模块
    python 多线程threading模块
    引用的声明周期结束时,并不会调用析构函数,只有本体的声明周期结束时,才会调用析构函数
    行为像指针的类的对象每次作为参数传入函数或者传出函数时都要小心
  • 原文地址:https://www.cnblogs.com/juepei/p/3786032.html
Copyright © 2011-2022 走看看