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>