当前位置: 代码迷 >> Java相关 >> Spring(10)Spring任务调度
  详细解决方案

Spring(10)Spring任务调度

热度:369   发布时间:2016-04-22 20:26:15.0
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>

 

  相关解决方案