调度事物:
从java 1.3开始,java sdk就通过java.until.Timer类提供基本的调度功能。
这个类允许你调度一个任务(通过java.until.TimerTask子类定义)按任意周期运行。
Spring通过TimerFactoryBean向应用程序上下文提供对JavaTimer的支持。
1、使用Java Timer调度任务
创建类TellLoveMeTask extends TimerTask
- package cn.partner4java.timer;
- import java.util.TimerTask;
- /**
- * 每天告诉你爱我
- * @author Administrator
- *
- */
- public class TellLoveMeTask extends TimerTask {
- public void run() {
- System.out.println("小媳妇我爱你");
- }
- }
配置spring文件:beans-timer.xml
- <!-- 在spring中声明我的定时器 当然,我们就可以按照通用的方式,给他注入一些bean -->
- <bean id="tellLoveMeTask" class="cn.partner4java.timer.TellLoveMeTask"></bean>
- <!-- 定义一个调度器,把我们定时器告诉他,告诉他调度时间 -->
- <bean id="scheduledTimerTask" class="org.springframework.scheduling.timer.ScheduledTimerTask">
- <property name="timerTask" ref="tellLoveMeTask"></property>
- <property name="period" value="20000"></property>
- <!-- 也可以延迟定时器的启动 -->
- <property name="delay" value="5000"></property>
- </bean>
- <!-- 定义一个启动器 -->
- <bean class="org.springframework.scheduling.timer.TimerFactoryBean">
- <property name="scheduledTimerTasks">
- <list>
- <ref bean="scheduledTimerTask"/>
- </list>
- </property>
- </bean>
交到web.xml,好启动spring
- <context-param>
- <param-name>contextConfigLocation</param-name>
- <param-value>classpath:beans-timer.xml</param-value>
- </context-param>
- <!-- 对Spring容器进行实例化 -->
- <listener>
- <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
- </listener>
2、使用Quartz调度器
那么我们可以反复的说我爱你了,但是我们是否可以每天在确定的时间说晚安呢?
额外加入包 quartz-all-1.6.0.jar commons-collections.jar jta.jar
编写类GoodNightDarling extends QuartzJobBean
- package cn.partner4java.timer;
- import org.quartz.JobExecutionContext;
- import org.quartz.JobExecutionException;
- import org.springframework.scheduling.quartz.QuartzJobBean;
- /**
- * 晚安亲爱的
- * @author Administrator
- *
- */
- public class GoodNightDarling extends QuartzJobBean {
- protected void executeInternal(JobExecutionContext arg0)
- throws JobExecutionException {
- System.out.println("晚安亲爱的");
- }
- }
配置配置文件
- <!-- 定义我们每天的晚安 -->
- <bean id="goodNightDarlingJob" class="org.springframework.scheduling.quartz.JobDetailBean">
- <property name="jobClass" value="cn.partner4java.timer.GoodNightDarling"></property>
- <!-- 注入bean -->
- <!--
- <property name="jobDataAsMap">
- <map>
- <entry key="rantService" value="rantService"></entry>
- </map>
- </property>
- -->
- </bean>
- <!-- 这个和我们上面功能上没有上面区别 -->
- <bean id="simpleReportTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean">
- <property name="jobDetail" ref="goodNightDarlingJob"></property>
- <!-- 延迟时间 -->
- <property name="startDelay" value="200000"></property>
- <!-- 重复时间 -->
- <property name="repeatInterval" value="30000"></property>
- </bean>
- <!-- 调度一个cron,这个调度器就有所区别了,能够指定每次调动的时间 -->
- <bean id="cronGoodNightTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
- <property name="jobDetail" ref="goodNightDarlingJob"></property>
- <property name="cronExpression" value="10 * * * * ?"></property>
- </bean>
- <!--
- cornExpression格式:
- 1、秒 0-59
- 2、分钟 0-59
- 3、小时 0-23
- 4、月份中的日期 1-31
- 5、月份 1-12 或者 JAN-DEC
- 6、星期中的日期 1-7 或者SUN-SAT
- 7、年份 1970-2099
- 例子:
- 0 0 10,14,16 * * ? 每天上午十点,下午两点,下午四点
- 0 0,15,30,45 * 1-10 * ? 每月前十天每个十五分钟
- 30 0 0 1 1 ? 2012 在2012年1月1日午夜过三十秒
- 0 0 8-5 ? * MON-FRI 每个工作日的工作时间
- -->
- <!-- 启动器 -->
- <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
- <property name="triggers">
- <list>
- <ref bean="cronGoodNightTrigger"/>
- </list>
- </property>
- </bean>
3、不单独书写定时器
- package cn.partner4java.timer;
- /**
- * 不用提醒,就应该去做饭
- * @author Administrator
- *
- */
- public class PrepareFood {
- public void hongShaoQieZi(){
- System.out.println("做了红烧茄子");
- }
- }
- <!-- 不单独书写定时器 -->
- <bean id="invokingPrepareFoodTimerTask" class="org.springframework.scheduling.timer.MethodInvokingTimerTaskFactoryBean">
- <property name="targetObject" ref="prepareFood"></property>
- <property name="targetMethod" value="hongShaoQieZi"></property>
- </bean>
- <bean id="invokingPrepareFoodJob" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
- <property name="targetObject" ref="prepareFood"></property>
- <property name="targetMethod" value="hongShaoQieZi"></property>
- </bean>