Spring定时器配置方式

方式一:自定义定时器类和定时器方法,好处是不用继承 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>
 

 

 

 

 

 

 

你可能感兴趣的:(spring)