Spring定时任务的简单例子

最近项目需要弄多个定时任务用爬虫批量抓取数据,用的spring定时job功能,简单总结下来:

package util;
import org.apache.log4j.*;
public class TaskJob {
 
          public static Logger log = Logger
                                        .getLogger(TaskJob.class);
            public void SayHello() {
                            //TODO Auto-generated method stub
                            try{
                                        log.info("处理任务开始>........");
                                        // 业务逻辑代码调用
                                        System.out.println("时间[" + newjava.util.Date().toLocaleString()
                                                                    + "]----->大家好啊!");
                                        log.info("处理任务结束!");
                            }catch (Exception e) {
                                        log.error("处理任务出现异常", e);
                            }
            }

}

2.接下来的在spring 里配置:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN""http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
        <beanname="taskJob" class="util.TaskJob" />

        <beanid="methodInvokingJobDetail"class="org.springframework.scheduling.quartz.MethodInvokingJobDetailF actoryBean">
            <property name="targetObject">
                    <ref bean="taskJob" />
            </property>
            <property name="targetMethod">
                    <value>SayHello</value>
            </property>
        </bean>
        <!--配置触发器 -->
        <beanid="cronTrigger"class="org.springframework.scheduling.quartz.CronTriggerBean">
                <!--这里不可以直接在属性jobDetail中引用taskJob,因为他要求的是一个jobDetail类型的对象,所以我们得通过MethodInvokingJobDetailF actoryBean来转一下-->
            <property name="jobDetail">
                    <ref bean="methodInvokingJobDetail" />
            </property>
            <!-- 每天的8点到21点每隔1分钟触发,具体说明见附录 -->
            <property name="cronExpression">
                    <value>0 * 08-21 * * ?</value>
            </property>

        </bean>

        <beanclass="org.springframework.scheduling.quartz.SchedulerFactoryBean">
            <!-- 添加触发器 -->
            <property name="triggers">
                    <list>
                            <reflocal="cronTrigger" />
                    </list>
            </property>
        </bean>

</beans>

----------------->>如果配置多任务,参数文件配置如下:
<?xml version="1.0" encoding="UTF-8"?>

<!-- - Application context definition for JPetStore's business layer. - Contains 
    bean references to the transaction manager and to the DAOs in - dataAccessContext-local/jta.xml 
    (see web.xml's "contextConfigLocation"). -->
<beans xmlns="http://www.springframework.org/schema/beans"
    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-2.0.xsd
           http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd
           http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd">

        <!-- 要调用的工作类 -->
        <bean id="quartzJob" class="com.writchie.quartz.QuartzJob"></bean> 
         <bean id="quartzJobTwo" class="com.writchie.quartz.QuartzJobTwo"></bean>
      <!-- 可继续加新的任务   --> 
         <!-- 要调用的工作类结束 --> 

         <!-- 定义调用对象和调用对象的方法 --> 
         <bean id="jobtask" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"> 
             <!-- 调用的类 --> 
             <property name="targetObject"> 
                 <ref bean="quartzJob"/> 
             </property> 
             <!-- 调用类中的方法 --> 
             <property name="targetMethod"> 
                 <value>work</value> 
             </property> 
         </bean> 

         <bean id="jobtask2" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"> 
             <!-- 调用的类 --> 
             <property name="targetObject"> 
                 <ref bean="quartzJobTwo"/> 
             </property> 
             <!-- 调用类中的方法 --> 
             <property name="targetMethod"> 
                 <value>work</value> 
             </property> 
         </bean> 
         <!-- 可继续加新的   --> 
       <!-- 定义调用对象和调用对象的方法结束 --> 

         <!-- 定义触发时间 --> 
         <bean id="doTime" class="org.springframework.scheduling.quartz.CronTriggerBean"> 
             <property name="jobDetail"> 
                 <ref bean="jobtask"/> 
             </property> 
             <!-- cron表达式 此处定义为一直触发执行任务 --> 
             <property name="cronExpression"> 
                 <value>10,15,20,25,30,35,40,45,50,55 * * * * ?</value> 
             </property> 
         </bean> 
         
         <bean id="doTime2" class="org.springframework.scheduling.quartz.CronTriggerBean"> 
             <property name="jobDetail"> 
                 <ref bean="jobtask2"/> 
             </property> 
             <!-- cron表达式   此处定义周一至周日的下午13:15触发--> 
             <property name="cronExpression"> 
                 <value>0 15 13 ? * SUN-SAT</value> 
             </property> 
         </bean> 
         <!-- 可继续加新的   --> 
         <!-- 定义触发时间结束 --> 

  <!-- 总管理类 如果将lazy-init='false'那么容器启动就会执行调度程序   --> 
         <bean id="startQuertz" lazy-init="false" autowire="no" class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> 
             <property name="triggers"> 
                 <list> 
                     <ref bean="doTime"/> 
                     <ref bean="doTime2"/> 
                   <!-- 可继续加新的   --> 

                 </list> 
             </property> 
         </bean> 
       <!-- 总管理类结束   --> 
</beans> 
-------------------->>多任务配置结束

3.测试执行的类,只要把spring的配置文件加载了就可以看到定时任务运行了。
package util;

import org.springframework.context.ApplicationContext;
importorg.springframework.context.support.ClassPathXmlApplicationC ontext;

public class TestApp {


public static void main(String[] args) {
        //TODO Auto-generated method stub
                System.out.println("加载spring配置文件....");
            ApplicationContextcontext = newClassPathXmlApplicationC ontext("applicationContext.xml");
            System.out.println("加载配置文件完毕!");
//    ApplicationContext context2= newClassPathXmlApplicationC ontext("test/timerTask/quartzTimer.xml");
}
}
--->>运行结果:
 
如果要在web项目中运行的话还要在web.xml 中加入如下代码:
<context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/classes/applicationContext.xml</param-value>
</context-param>
<context-param>
        <param-name>log4jConfigLocation</param-name>
        <param-value>/WEB-INF/log4j.properties</param-value>
</context-param>
<listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

说明:
------------------------------------------------------------------------------------------------------------------------------------

         1)Cron表达式的格式:秒 分 时 日 月 周 年(可选)。

               字段名                 允许的值                        允许的特殊字符  

               秒                         0-59                               , - * /  

               分                         0-59                               , - * /  

               小时                   0-23                               , - * /  

               日                         1-31                               , - * ? / L W C  

               月                         1-12 or JAN-DEC          , - * /  

               周几                     1-7 or SUN-SAT            , - * ? / L C #  

               年 (可选字段)     empty, 1970-2099      , - * /

               “?”字符:表示不确定的值

               “,”字符:指定数个值

               “-”字符:指定一个值的范围

               “/”字符:指定一个值的增加幅度。n/m表示从n开始,每次增加m

               “L”字符:用在日表示一个月中的最后一天,用在周表示该月最后一个星期X

               “W”字符:指定离给定日期最近的工作日(周一到周五)

               “#”字符:表示该月第几个周X。6#3表示该月第3个周五

         2)Cron表达式范例:

                 每隔5秒执行一次:*/5 * * * * ?

                 每隔1分钟执行一次:0 */1 * * * ?

                 每天23点执行一次:0 0 23 * * ?

                 每天凌晨1点执行一次:0 0 1 * * ?

                 每月1号凌晨1点执行一次:0 0 1 1 * ?

                 每月最后一天23点执行一次:0 0 23 L * ?

                 每周星期天凌晨1点实行一次:0 0 1 ? * L

                 在26分、29分、33分执行一次:0 26,29,33 * * * ?

                 每天的0点、13点、18点、21点都执行一次:0 0 0,13,18,21 * * ?

---------------------------------------------------------------------------------------------------------------------------

注意及问题:
   
​     1.配置环境除过需要spring的相关类包[我用的是spring 4.0版本],还需要3个包:
​        slf4j-log4j12-1.6.1.jar
​        slf4j-api-1.6.1.jar
​        Quartz1.85
​     2.使用spring定时任务包Quartz时,必须使用Quartz1.85以下版本的。 
        查看发现spring3.0.5中org.springframework.scheduling.quartz.CronTriggerBean继承了 
        org.quartz.CronTrigger(public class CronTriggerBeanextends CronTrigger), 
        而在quartz2.1.3中org.quartz.CronTrigger是个接口(publicabstract interface CronTrigger extends Trigger), 
       而在quartz1.8.5及1.8.4中org.quartz.CronTrigger是个类(publicclass CronTrigger extends Trigger),
       从而造成无法在applicationContext中配置触发器。这是spring3和quartz2版本不兼容的一个bug;
​     3.spring定时任务可用的项目可以是java project,web project,app project,配置大同小异;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值