理解spring任务调度timer,Quartz,spring task

1.timer
指调用java.util.timer类来调用一个java.util.TimerTask的任务来实现每隔多长时间运行一次。

spring-context中集成了timer调用所需的类,所以只需要拿来使用即可。
下面是具体的做法:
<1>定义基础类Timetest,里面的run方法,就是你要定时执行的操作。

public class Timetest extends TimerTask {

    public void run(){
        System.out.println("数据库执行了两次");
    }


}

<2>在spring-application.xml配置:


    <!-- 使用timer实现任务调度 -->

    <bean id="scheduledTimerTask" class="org.springframework.scheduling.timer.ScheduledTimerTask">
        <property name="timerTask" ref="timetest" />

        <!-- 每隔一天执行一次配置: 24*60*60*1000 -->
        <!-- 每1秒钟程序执行一次 -->
        <property name="period" value="3000" />

        <!-- 程序启动4秒钟后开始执行 -->
        <property name="delay" value="4000" />
    </bean>

    <bean id="timerFactoryBean" class="org.springframework.scheduling.timer.TimerFactoryBean">
        <property name="scheduledTimerTasks">
            <list>
                <ref bean="scheduledTimerTask" />
            </list>
        </property>
    </bean>

    <bean id="timetest" class="com.tc.tccp.core.util.Timetest">

    </bean>

ScheduledTimerTask:说明任务调度的具体配置,例如隔多长时间执行一次,延迟多久开始,及执行哪个bean中的run()方法。
然后启动你的项目,run()方法便会执行。

注意:TimerFactoryBean,ScheduledTimerTask所对应的类在spring-context.jar包中,我用4.1.6.RELEASE版本,一直报找不到该类的错误,因此降低版本至3,下面是pom.xml:

<dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>3.2.18.RELEASE</version>
</dependency>

2.spring中集成Quartz
主要有两种方式:
<1>具体执行的job类继承QuartzJobBean
1.1具体执行的job类

package com.tc.tccp.core.util;

import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.scheduling.quartz.QuartzJobBean;

/**
 * @author wangpei
 * @version 创建时间:2017年7月17日 下午1:18:47 类说明
 */
public class Jobtest extends QuartzJobBean {

    @Override
    protected void executeInternal(JobExecutionContext arg0)
            throws JobExecutionException {
        System.out.println("操作数据库");
    }

}

2.spring-application.xml的配置文件

<bean name="Jobtest" 
    class="org.springframework.scheduling.quartz
    .JobDetailBean">
<property name="jobClass" 
    value="com.tc.tccp.core.util.Jobtest" />
</bean>
<bean id="simpleTrigger" 
    class="org.springframework.scheduling.quartz    .SimpleTriggerBean">
    <property name="jobDetail" ref="Jobtest" />
    <property name="startDelay" value="0" />
    <property name="repeatInterval" value="2000"  />
</bean>
<bean   
 class="org.springframework.scheduling.quartz
 .SchedulerFactoryBean">
        <property name="triggers">
            <list>
                <ref bean="simpleTrigger" />
            </list>
        </property>
</bean>

说明:
JobDetailBean:具体的任务执行程序,主要指定具体调用哪个job任务。
simpleTrigger:触发器,主要配置调度参数,例如隔多长时间执行
SchedulerFactoryBean: 生成Scheduler调度容器。

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context-     support</artifactId>
            <version>3.2.18.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.quartz-scheduler</groupId>
            <artifactId>quartz</artifactId>
            <version>1.8.5</version>
        </dependency>
     **结果**:每个2s输出操作数据库

<2>job类为普通java类方式
(1)job类

package com.tc.tccp.core.util;
/** 
 * @author wangpei 
 * @version 创建时间:2017年7月18日 下午5:18:11 
 * 类说明 
 */
public class Job2test {
    public void executeMethod(){
        System.out.println("数据库执行的第三种方式");
    }

}

(2)spring-application.xml

<!-- Quartz普通java类的方式 -->
    <bean id="Job2test"
        class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
        <property name="targetObject">
            <bean class="com.tc.tccp.core.util.Job2test" />
        </property>
        <property name="targetMethod" value="executeMethod" />
        <property name="concurrent" value="false" />
    </bean>

    <bean id="simpleTrigger2" class="org.springframework.scheduling.quartz.SimpleTriggerBean">
        <property name="jobDetail" ref="Job2test" />
        <property name="startDelay" value="0" />
        <property name="repeatInterval" value="5000" />
    </bean>

    <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
        <property name="triggers">
            <list>
                <ref bean="simpleTrigger2" />
            </list>
        </property>
    </bean>

3.spring-task的应用
<1>配置文件的方式实现:
spring-application.xml中添加:

<task:scheduled-tasks>
    <task:scheduled ref="tasktest1" method="execute" cron="*/5 * * * * ?" />
</task:scheduled-tasks>

    <bean id="tasktest1" class="com.tc.tccp.core.util.Tasktest">

    </bean>

普通job类:

package com.tc.tccp.core.util;

/**
 * @author wangpei
 * @version 创建时间:2017年7月18日 下午5:35:55 类说明
 */

public class Tasktest {

    public void execute() {
        System.out.println("这是task方式的第一种方法");

    }

}

几种方式的对比
对于java.util.timer:
缺点:
<1>其采用单线程来处理所有的任务,若一个任务所用的时间比较长,那么后面的任务一直不能执行。
<2>若在运行过程中发生异常,则线程会终止执行,这使得后面的任务都不能执行。

改进:运行Executor的scheduleExecutor来实现线程池中多线程处理任务。
scheduleExecutor缺点:不能处理复杂任务,例如规定执行的时间为:除过周末和节假日的中午12:00
改进:引入Quart框架
缺点:Quartz是一个重量级框架,使用起来不方便。
引入:spring3.0以后引入 spring-task

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值