1、任务调度
第一种情况(继承TimerTask)
BatchUpdate.java
package com.ljb.timer.timertask; import java.util.Iterator; import java.util.List; import java.util.TimerTask; /** * 使用继承的方式创建定时任务 * @author Administrator * */ public class BatchUpdate extends TimerTask { private List commands; public void setCommands(List commands) { this.commands = commands; } @Override public void run() { for (Iterator it = commands.iterator();it.hasNext();) { System.out.println(it.next()); } System.out.println("批量更新执行完毕!"); } }
extendsTimerTask_applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"> <!-- 创建任务 --> <bean id="batch_update" class="com.ljb.timer.timertask.BatchUpdate"> <property name="commands"> <list> <value>update person set onduty="出勤" where date=${ontime}</value> <value>update person set onduty="缺勤" where date=${miss}</value> <value>update person set onduty="迟到" where date=${late}</value> </list> </property> </bean> <!-- 配置执行任务 --> <bean id="scheduledTimerTask" class="org.springframework.scheduling.timer.ScheduledTimerTask"> <property name="timerTask" ref="batch_update"></property> <property name="delay" value="1000"></property> <property name="period" value="2000"></property> </bean> <!-- 启动任务 --> <bean id="timerFactoryBean" class="org.springframework.scheduling.timer.TimerFactoryBean"> <property name="scheduledTimerTasks"> <list> <ref local="scheduledTimerTask"/> </list> </property> </bean> </beans>
ExtendsTest.java
package com.ljb.timer.timertask; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class ExtendsTest { /** * @param args */ public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext("extendsTimerTask_applicationContext.xml"); } }
第二种情况(在spring中配置MethodInvokingTimerTaskFactoryBean)
BatchUpdateTwo.java
package com.ljb.timer.timertask; import java.util.Iterator; import java.util.List; import java.util.TimerTask; /** * 使用MethodInvokingTimerFactoryBean创建定时任务 * @author Administrator * */ public class BatchUpdateTwo{ private List commands; public void setCommands(List commands) { this.commands = commands; } public void run() { for (Iterator it = commands.iterator();it.hasNext();) { System.out.println(it.next()); } System.out.println("methodInvoking批量更新执行完毕!"); } }
methodInvokingTimerTaskFactoryBean_applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"> <bean id="batchUpdate2" class="com.ljb.timer.timertask.BatchUpdateTwo"> <property name="commands"> <list> <value>update person set onduty="出勤" where date=${ontime}</value> <value>update person set onduty="缺勤" where date=${miss}</value> <value>update person set onduty="迟到" where date=${late}</value> </list> </property> </bean> <bean id="methodInvokingTimerTaskFactoryBean" class="org.springframework.scheduling.timer.MethodInvokingTimerTaskFactoryBean"> <property name="targetObject" ref="batchUpdate2"></property> <property name="targetMethod" value="run"></property> </bean> <bean id="scheduledTimerTask" class="org.springframework.scheduling.timer.ScheduledTimerTask"> <property name="timerTask" ref="methodInvokingTimerTaskFactoryBean"></property> <property name="delay" value="1000"></property> <property name="period" value="2000"></property> </bean> <bean id="timerFactoryBean" class="org.springframework.scheduling.timer.TimerFactoryBean"> <property name="scheduledTimerTasks"> <list> <ref local="scheduledTimerTask"/> </list> </property> </bean> </beans>
MethodInvokingTest.java
package com.ljb.timer.timertask; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class MethodInvokingTest { /** * @param args */ public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext("methodInvokingTimerTaskFactoryBean_applicationContext.xml"); } }
2、使用Quartz
样例:
第一种情况(传统quartz任务,继承QuartzJobBean)
QuartzJob.java
package com.ljb.quartz.jobdetail; import java.util.Date; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; import org.springframework.scheduling.quartz.QuartzJobBean; public class QuartzJob extends QuartzJobBean { private String command; public void setCommand(String command) { this.command = command; } @Override protected void executeInternal(JobExecutionContext arg0) 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任务执行完毕"); } }
quartzJob_applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"> <!-- 传统方式创建quartz任务bean --> <bean id="quartzJob" class="org.springframework.scheduling.quartz.JobDetailBean"> <property name="jobClass"> <value>com.ljb.quartz.jobdetail.QuartzJob</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="quartzJob"></property> <property name="startDelay" value="1000"></property> <property name="repeatInterval" value="2000"></property> </bean> <!-- 启动任务 --> <bean id="schedulerFactoryBean" class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> <property name="triggers"> <list> <ref local="simpleTrigger"/> </list> </property> </bean> </beans>
RunQuartzJob.java
package com.ljb.quartz.jobdetail; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class RunQuartzJob { /** * @param args */ public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext("quartzJob_applicationContext.xml"); } }
注:需要的jar包(commons-collections-3.1.jar;quartz-all-1.6.0.jar;jta-1.1.jar)
执行结果:
Mon Jul 06 13:43:51 CST 2015:传统quartz任务被调用
命令更新被第1次被调用
命令更新被第2次被调用
命令更新被第3次被调用
命令更新被第4次被调用
命令更新被第5次被调用
命令更新被第6次被调用
命令更新被第7次被调用
命令更新被第8次被调用
命令更新被第9次被调用
命令更新被第10次被调用
Mon Jul 06 13:43:51 CST 2015:传统quartz任务执行完毕
Mon Jul 06 13:43:53 CST 2015:传统quartz任务被调用
命令更新被第1次被调用
命令更新被第2次被调用
命令更新被第3次被调用
命令更新被第4次被调用
命令更新被第5次被调用
命令更新被第6次被调用
命令更新被第7次被调用
命令更新被第8次被调用
命令更新被第9次被调用
命令更新被第10次被调用
Mon Jul 06 13:43:53 CST 2015:传统quartz任务执行完毕
第二种情况(在spring中配置MethodInvokingJobDetailFactoryBean)
QuartzJob2.java
package com.ljb.quartz.jobdetail; import java.util.Date; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; public class QuartzJob2{ private String command; public void setCommand(String command) { this.command = command; } public void test() throws JobExecutionException { System.out.println(new Date() + ":使用methodInvoking传统quartz任务被调用"); for (int i=1; i <=10 ; i++) { System.out.println("命令"+ command + "被第"+i+"次被调用"); } System.out.println(new Date() + ":使用methodInvoking传统quartz任务执行完毕"); } }
quartzJob_applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"> <!-- 传统方式创建quartz任务bean --> <bean id="quartzJob" class="com.ljb.quartz.jobdetail.QuartzJob2"> <property name="command" value="更新"> </property> </bean> <!-- 配置通過方法調用任務器 --> <bean id="methodInvoking" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"> <property name="targetObject" ref="quartzJob"></property> <property name="targetMethod" value="test"></property> </bean> <!-- 简单触发器 --> <bean id="simpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean"> <property name="jobDetail" ref="methodInvoking"></property> <property name="startDelay" value="1000"></property> <property name="repeatInterval" value="2000"></property> </bean> <!-- 启动任务 --> <bean id="schedulerFactoryBean" class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> <property name="triggers"> <list> <ref local="simpleTrigger"/> </list> </property> </bean> </beans>
RunQuartzJob.java
package com.ljb.quartz.jobdetail; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class RunQuartzJob { /** * @param args */ public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext("quartzJob_applicationContext.xml"); } }
执行结果:
Mon Jul 06 14:19:45 CST 2015:使用methodInvoking传统quartz任务被调用 命令更新被第1次被调用 命令更新被第2次被调用 命令更新被第3次被调用 命令更新被第4次被调用 命令更新被第5次被调用 命令更新被第6次被调用 命令更新被第7次被调用 命令更新被第8次被调用 命令更新被第9次被调用 命令更新被第10次被调用 Mon Jul 06 14:19:45 CST 2015:使用methodInvoking传统quartz任务执行完毕 Mon Jul 06 14:19:47 CST 2015:使用methodInvoking传统quartz任务被调用 命令更新被第1次被调用 命令更新被第2次被调用 命令更新被第3次被调用 命令更新被第4次被调用 命令更新被第5次被调用 命令更新被第6次被调用 命令更新被第7次被调用 命令更新被第8次被调用 命令更新被第9次被调用 命令更新被第10次被调用 Mon Jul 06 14:19:47 CST 2015:使用methodInvoking传统quartz任务执行完毕
第三种情况(使用cronTrigger触发器)
quartzJob_applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"> <!-- 传统方式创建quartz任务bean --> <bean id="quartzJob" class="com.ljb.quartz.jobdetail.QuartzJob2"> <property name="command" value="更新"> </property> </bean> <!-- 配置通過方法調用任務器 --> <bean id="methodInvoking" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"> <property name="targetObject" ref="quartzJob"></property> <property name="targetMethod" value="test"></property> </bean> <!-- 简单触发器 --> <!-- <bean id="simpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean"> <property name="jobDetail" ref="methodInvoking"></property> <property name="startDelay" value="1000"></property> <property name="repeatInterval" value="2000"></property> </bean> --> <!-- 表達式触发器 --> <bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean"> <property name="jobDetail" ref="methodInvoking"></property> <property name="cronExpression"> <value>00 32 16 * * ?</value> </property> </bean> <!-- 启动任务 --> <bean id="schedulerFactoryBean" class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> <property name="triggers"> <list> <ref local="cronTrigger"/> </list> </property> </bean> </beans>
执行结果:
Mon Jul 06 16:32:00 CST 2015:使用(表达式触发器)methodInvoking传统quartz任务被调用
命令更新被第1次被调用
命令更新被第2次被调用
命令更新被第3次被调用
命令更新被第4次被调用
命令更新被第5次被调用
命令更新被第6次被调用
命令更新被第7次被调用
命令更新被第8次被调用
命令更新被第9次被调用
命令更新被第10次被调用
Mon Jul 06 16:32:00 CST 2015:使用(表达式触发器)methodInvoking传统quartz任务执行完毕