• 理解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

  • 相关阅读:
    PostgreSQL的数据类型
    博客园背景页面动态特效
    css ie7中overflow:hidden失效问题及解决方法
    win10的安装、win10启动盘制作
    windows win7 win10 多系统启动菜单 多系统引导设置
    微博加关注按钮
    {转}一位北京差生9年的北京生活
    最全的CSS浏览器兼容问题
    网站开发命名详细规范
    <meta http-equiv = "X-UA-Compatible" cotent = "IE=edge,chrome=1"/>
  • 原文地址:https://www.cnblogs.com/wangxiaopei/p/8551194.html
Copyright © 2020-2023  润新知