方式一:自定义定时器类和定时器方法,好处是不用继承 java.util.TimerTask
或者org.springframework.scheduling.quartz.QuartzJobBean
public class TestTask1 { private static final Logger log=Logger.getLogger(TestTask1.class); public void tasktrigger(){ log.info("TestTask1定时器触发.........."); } }
Spring上下文配置:
<!-- TestTask1定时器配置 -->
<bean id="testTimer" class="com.square.usermodule.timertask.TestTimer"></bean> <bean id="testJobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"> <!-- 目标对象 --> <property name="targetObject" ref="testTimer"></property> <!-- 目标方法 --> <property name="targetMethod"> <value>tasktrigger</value> </property> </bean> <!-- 配置定时器 --> <bean id="testCronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean"> <property name="jobDetail" ref="testJobDetail"></property> <property name="cronExpression"> <!-- 每10秒触发一次 --> <value>0/10 * * ? * *</value> </property> </bean> <!-- 启动定时器 --> <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> <!-- 定时器列表 --> <property name="triggers"> <list> <ref local="testCronTrigger"/> </list> </property> </bean>
tomcat服务器启动:1分钟结果
INFO [DefaultQuartzScheduler_Worker-7] TestTimer.tasktrigger(10) | TestTask1定时器触发..........
INFO [DefaultQuartzScheduler_Worker-7] TestTimer.tasktrigger(10) | TestTask1定时器触发..........
INFO [DefaultQuartzScheduler_Worker-7] TestTimer.tasktrigger(10) | TestTask1定时器触发..........
INFO [DefaultQuartzScheduler_Worker-7] TestTimer.tasktrigger(10) | TestTask1定时器触发..........
INFO [DefaultQuartzScheduler_Worker-7] TestTimer.tasktrigger(10) | TestTask1定时器触发..........
INFO [DefaultQuartzScheduler_Worker-7] TestTimer.tasktrigger(10) | TestTask1定时器触发..........
方式二:继承org.springframework.scheduling.quartz.QuartzJobBean实现executeInternal方法
public class TestTask2 extends QuartzJobBean { private static final Logger log = Logger.getLogger(TestTask2.class); private String message; public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } @Override protected void executeInternal(JobExecutionContext arg0) throws JobExecutionException { log.info(message); } }
上下文配置:
<!-- TestTask2定时器配置 --> <bean id="testJobDetail2" class="org.springframework.scheduling.quartz.JobDetailBean"> <!-- 应该是适配器模式,通过jobClass属性找到TestTask2类返回JobDetail对象 --> <property name="jobClass"> <value>packageName.TestTask2</value> </property> <!-- TestTask2类与他的message属性是间接设置的,通过键值对方式对属性注入 --> <property name="jobDataAsMap"> <map> <entry key="message"> <value>TestTask2定时器触发......</value> </entry> </map> </property> </bean> <!-- 配置定时器TestTask2 --> <bean id="testCronTrigger2" class="org.springframework.scheduling.quartz.CronTriggerBean"> <property name="jobDetail" ref="testJobDetail2"></property> <property name="cronExpression"> <!-- 每10秒触发一次 --> <value>0/10 * * ? * *</value> </property> </bean> <!-- 启动定时器 --> <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> <!-- 定时器列表 --> <property name="triggers"> <list> <ref local="testCronTrigger2"/> </list> </property> </bean>
tomcat服务器启动:1分钟结果
INFO [DefaultQuartzScheduler_Worker-9] TestTask2.executeInternal(23) | TestTask2定时器触发......
INFO [DefaultQuartzScheduler_Worker-9] TestTask2.executeInternal(23) | TestTask2定时器触发......
INFO [DefaultQuartzScheduler_Worker-9] TestTask2.executeInternal(23) | TestTask2定时器触发......
INFO [DefaultQuartzScheduler_Worker-9] TestTask2.executeInternal(23) | TestTask2定时器触发......
INFO [DefaultQuartzScheduler_Worker-9] TestTask2.executeInternal(23) | TestTask2定时器触发......
INFO [DefaultQuartzScheduler_Worker-9] TestTask2.executeInternal(23) | TestTask2定时器触发......
方式三:继承java.util.TimerTask类实现run方法
(不建议采用,因为在spring3.0中org.springframework.scheduling.timer包
已标志过时)
public class TestTask3 extends TimerTask { private static final Logger log=Logger.getLogger(TestTask3.class); @Override public void run() { log.info("TestTask3定时器触发"); } }
上下文配置:
<bean id="testTask3" class="com.square.usermodule.timertask.TestTask3"></bean> <!--配置定时器--> <bean id="testTimer" class="org.springframework.scheduling.timer.ScheduledTimerTask"> <property name="timerTask" ref="testTask3" /> <property name="period"> <value>10000</value> </property> </bean> <!--启动定时器--> <bean class="org.springframework.scheduling.timer.TimerFactoryBean"> <property name="scheduledTimerTasks"> <list> <ref bean="testTimer" /> </list> </property> </bean>
tomcat服务器启动:1分钟结果
INFO [Timer-0] TestTask3.run(13) | TestTask3定时器触发
INFO [Timer-0] TestTask3.run(13) | TestTask3定时器触发
INFO [Timer-0] TestTask3.run(13) | TestTask3定时器触发
INFO [Timer-0] TestTask3.run(13) | TestTask3定时器触发
INFO [Timer-0] TestTask3.run(13) | TestTask3定时器触发
方式四:注解支持@Scheduled
这个是转载http://zywang.iteye.com/blog/949123
@Component public class TestTask4 { private static Logger log=Logger.getLogger(TestTask4.class); // 这表示延迟执行,每5秒执行一次,也就是不确定开始时间 @Scheduled(fixedDelay=5000) public void doSomethingWithDelay(){ log.info("I'm doing with delay now!"); } // 表示服务器启动的时候立即执行,每5秒执行一次 @Scheduled(fixedRate=5000) public void doSomethingWithRate(){ log.info("I'm doing with rate now!"); } // cron表达式,表示每5秒执行一次 @Scheduled(cron="0/5 * * ? * *") public void doSomethingWithCron(){ log.info("I'm doing with cron now!"); } }
上下文配置:
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:task="http://www.springframework.org/schema/task" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-3.0.xsd"> <!--注解驱动会去这个包找到bean类--> <context:component-scan base-package="定时类所在的包名" /> <!--这个应该是开启Spring 的@Scheduled 注解编程吧--> <!-- Enables the Spring Task @Scheduled programming model --> <task:executor id="executor" pool-size="5" /> <task:scheduler id="scheduler" pool-size="10" /> <task:annotation-driven executor="executor" scheduler="scheduler" />
tomcat服务器启动:结果如下
3219 INFO [scheduler-2] com.wgk.demo1.timertask.TestTask4 - I'm doing with cron now!
6390 INFO [scheduler-3] com.wgk.demo1.timertask.TestTask4 - I'm doing with rate now!
6406 INFO [scheduler-4] com.wgk.demo1.timertask.TestTask4 - I'm doing with delay now!
8219 INFO [scheduler-1] com.wgk.demo1.timertask.TestTask4 - I'm doing with cron now!
11422 INFO [scheduler-2] com.wgk.demo1.timertask.TestTask4 - I'm doing with rate now!
11437 INFO [scheduler-1] com.wgk.demo1.timertask.TestTask4 - I'm doing with delay now!
13250 INFO [scheduler-2] com.wgk.demo1.timertask.TestTask4 - I'm doing with cron now!
16422 INFO [scheduler-2] com.wgk.demo1.timertask.TestTask4 - I'm doing with rate now!
16437 INFO [scheduler-4] com.wgk.demo1.timertask.TestTask4 - I'm doing with delay now!
Cron表达式简单例子:
<beans> <!-- 一个cron表达式有至少6个(也可能是7个)由空格分隔的时间元素。从左至右,这些元素的定义如下: 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-59 , - * / 分 0-59 , - * / 小时 0-23 , - * / 日期 1-31 , - * ? / L W C 月份 1-12 或者 JAN-DEC , - * / 星期 1-7 或者 SUN-SAT , - * ? / L C # 年(可选)留空, 1970-2099 , - * / 表达式意义 "0 0 12 * * ?" 每天中午12点触发 "0 15 10 ? * *" 每天上午10:15触发 "0 15 10 * * ?" 每天上午10:15触发 "0 15 10 * * ? *" 每天上午10:15触发 "0 15 10 * * ? 2005" 2005年的每天上午10:15触发 "0 * 14 * * ?" 在每天下午2点到下午2:59期间的每1分钟触发 "0 0/5 14 * * ?" 在每天下午2点到下午2:55期间的每5分钟触发 "0 0/5 14,18 * * ?" 在每天下午2点到2:55期间和下午6点到6:55期间的每5分钟触发 "0 0-5 14 * * ?" 在每天下午2点到下午2:05期间的每1分钟触发 "0 10,44 14 ? 3 WED" 每年三月的星期三的下午2:10和2:44触发 "0 15 10 ? * MON-FRI" 周一至周五的上午10:15触发 "0 15 10 15 * ?" 每月15日上午10:15触发 "0 15 10 L * ?" 每月最后一日的上午10:15触发 "0 15 10 ? * 6L" 每月的最后一个星期五上午10:15触发 "0 15 10 ? * 6L 2002-2005" 2002年至2005年的每月的最后一个星期五上午10:15触发 "0 15 10 ? * 6#3" 每月的第三个星期五上午10:15触发 每天早上6点 0 6 * * * 每两个小时 0 */2 * * * 晚上11点到早上7点之间每两个小时,早上八点 0 23-7/2,8 * * * 每个月的4号和每个礼拜的礼拜一到礼拜三的早上11点 0 11 4 * 1-3 1月1日早上4点 0 4 1 1 * --> </beans>