Fork me on GitHub

Spring(十)Spring任务调度

一、计划任务

需要定时执行一些计划(定时更新等),这样的计划称之为计划任务

Spring抽象封装了Java提供的Timer与TimerTask类

也可以使用拥有更多任务计划功能的Quartz

二、TimerTask

2.1、继承TimerTask类重写run方法

 

实现类

package com.pb.task.timertask;

import java.util.Iterator;
import java.util.List;
import java.util.TimerTask;

public class BatchUpdate extends TimerTask {
    //存放SQL
    private List commons;
    @Override
    public void run() {
        //输出语句
        for(Iterator it=commons.iterator();it.hasNext();){
            System.out.println(it.next());
        }
        System.out.println("timertask批量更新完毕");
    }
    public void setCommons(List commons) {
        this.commons = commons;
    }

    
    
}

配置文件:

<?xml version="1.0" encoding="UTF-8"?>
<beans
    xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:p="http://www.springframework.org/schema/p"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd">

<bean id="batch_update" class="com.pb.task.timertask.BatchUpdate">
<property name="commons">
<list>
<value>update personn set onduty="出勤" where date=${ontime}</value>
<value>update personn set onduty="缺勤" where date=${miss}</value>
<value>update personn set onduty="迟到" where date=${late}</value>
<value>update personn set onduty="早退" where date=${early}</value>
</list>
</property>
</bean>

<!-- 配置任务调度的类 -->
<bean id="update_schuleTask" class="org.springframework.scheduling.timer.ScheduledTimerTask">
<property name="timerTask" ref="batch_update"/>
<!--启动任务后多久开始执行  -->
<property name="delay">
<value>1000</value>
</property>
<!--第一次记动后后多久执行一次  2秒重复一次-->
<property name="period">
<value>2000</value>
</property>
</bean>
<!--启动任务  -->
<bean id="timerFactory" class="org.springframework.scheduling.timer.TimerFactoryBean">
<!--任务调度类  -->
<property name="scheduledTimerTasks">
<list>
<ref local="update_schuleTask"/>
</list>
</property>
</bean>
</beans>

测试类只需要调用

ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");

 

2.2、使用Spring提供的MethodInvokingTimerTaskFactoryBean定义计划任务

package com.pb.task.timertask;

import java.util.Iterator;
import java.util.List;
import java.util.TimerTask;

public class MethodInvokingBatchUpdate {
    //存放SQL
    private List commons;
    
    public void run() {
        //输出语句
        for(Iterator it=commons.iterator();it.hasNext();){
            System.out.println(it.next());
        }
        System.out.println("MethodInvoking批量更新完毕");
    }
    public void setCommons(List commons) {
        this.commons = commons;
    }

    
    
}

配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans
    xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:p="http://www.springframework.org/schema/p"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd">

<bean id="batch_update" class="com.pb.task.timertask.MethodInvokingBatchUpdate">
<property name="commons">
<list>
<value>update personn set onduty="出勤" where date=${ontime}</value>
<value>update personn set onduty="缺勤" where date=${miss}</value>
<value>update personn set onduty="迟到" where date=${late}</value>
<value>update personn set onduty="早退" where date=${early}</value>
</list>
</property>
</bean>
<!--配置方法的调用类  -->
<bean id="methodInvoking" class="org.springframework.scheduling.timer.MethodInvokingTimerTaskFactoryBean">
<property name="targetObject" ref="batch_update"></property>
<property name="targetMethod" value="run"/>

</bean>

<!-- 配置任务调度的类 -->
<bean id="update_schuleTask" class="org.springframework.scheduling.timer.ScheduledTimerTask">
<property name="timerTask" ref="methodInvoking"/>
<!--启动任务后多久开始执行  -->
<property name="delay">
<value>1000</value>
</property>
<!--第一次记动后后多久执行一次  2秒重复一次-->
<property name="period">
<value>2000</value>
</property>
</bean>
<!--启动任务  -->
<bean id="timerFactory" class="org.springframework.scheduling.timer.TimerFactoryBean">
<!--任务调度类  -->
<property name="scheduledTimerTasks">
<list>
<ref local="update_schuleTask"/>
</list>
</property>
</bean>
</beans>

 

三、QuartzJobBean实现

传统QuartzJob

需要jta.jar 和quartz-all-1.6.0.jar2个jar包

package com.pb.quartz.job;

import java.util.Date;

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

/**
 * 传统的使用Quartz
 *
 */
public  class QuartzUpdate extends QuartzJobBean {
    private String command;
    
    @Override
    protected void executeInternal(JobExecutionContext context)
            throws JobExecutionException {
        System.out.println(new Date()+":"+"传统Quartz任务被高度");
        for (int i = 1; i <= 10; i++) {
            System.out.println("命令:"+command+"第"+i+"次被谳用");
            
        }
        System.out.println(new Date()+"传统Quartz调度完成");
    }
    public void setCommand(String command) {
        this.command = command;
    }

    

}

配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans
    xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:p="http://www.springframework.org/schema/p"
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans-3.1.xsd">

<!--配置传统方式创建Quartz  -->
<bean id="t_quartz" class="org.springframework.scheduling.quartz.JobDetailBean">
<!--配置哪个类  -->
<property name="jobClass">
<!--关联  -->
<value>com.pb.quartz.job.QuartzUpdate</value>
</property>

<!-- 赋值-->
<property name="jobDataAsMap">
<map>
<entry key="command">
<value>更新</value>
</entry>
</map>
</property>
</bean>

<!--配置触发器简单触发器  -->
<bean id="simpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean">
<property name="jobDetail" ref="t_quartz"/>
<!--启动时间  -->
<property name="startDelay">
<value>1000</value>
</property>
<!--间隔  -->
<property name="repeatInterval">
<value>2000</value>
</property>
</bean>
<!--启动任务  -->
<bean id="quartzFactory" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref local="simpleTrigger"/>
</list>
</property>
</bean>
</beans>

使用MethodInvoking方式

 

package com.pb.quartz.methodinvoking.update;

public class UpdateQuartzJob {
    
    private String command;
    
    public void show(){
        System.out.println("MethodInvoking方式调度开始"+command);
        for (int i = 1; i <=10; i++) {
            System.out.println("命令:"+command+"第"+i+"次调用");
        }
        System.out.println("MethodInvoking方式调度结束"+command);
    }

    public String getCommand() {
        return command;
    }

    public void setCommand(String command) {
        this.command = command;
    }
    

}

配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans
    xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:p="http://www.springframework.org/schema/p"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd">
<!-- 执行的Bean -->
<bean id="updateQuartzJob" class="com.pb.quartz.methodinvoking.update.UpdateQuartzJob">
<property name="command">
<value>Spring新型更新或者插入</value>
</property>
</bean>
<!-- 新的通过方式调用的 -->
<bean id="methodInvoking" class="    org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<!--哪个类要被调用  -->
<property name="targetObject" ref="updateQuartzJob"/>
<!--哪个方法要执行  -->
<property name="targetMethod" value="show"/>
</bean>
<!--配置触发器定时触发器  -->
<bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="jobDetail" ref="methodInvoking"/>
<!--表达式  -->
<property name="cronExpression">
<!-- 每天23:17:01秒调用 -->
<value>02 17 23 * * ?</value>
</property>
</bean>

<!--启动任  -->
<bean id="quartzFactory" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<!--触发器名字  -->
<property name="triggers">
<list>
<ref local="cronTrigger" />
</list>
</property>
</bean>


</beans>

 

posted @ 2015-04-12 23:20  森林森  阅读(790)  评论(1编辑  收藏  举报