spring定时器的两种实现方式

    第一种方式 通过extends TimerTask来实现 该种方式不能精确到几点执行 。

    第二种方式  通过quartz来实现任务的精确调度。该方式依赖以下jar包:quartz-1.6.0.jar spring.jar  commons-*.jar

 

 类实现:

Clock 类:

import java.util.TimerTask;

public class Clock extends TimerTask {

	@Override
	public void run() {
		// TODO Auto-generated method stub
		System.out.println("start run clock,clock。。。。。!!");
	}

	
}


QuartzClock类:

 

import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.scheduling.quartz.QuartzJobBean;

public class QuartzClock extends QuartzJobBean{

	@Override
	protected void executeInternal(JobExecutionContext arg0)
			throws JobExecutionException {
		// TODO Auto-generated method stub
		System.out.println("start run QuartzClock,QuartzClock。。。!!");
	}

	
}


下面是配置文件:

applicationContext.xml 文件:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>

	<!-- 定时器 -->
	<!--  第一种方式 通过extends TimerTask来实现 该种方式不能精确到几点执行 -->
	<!-- 第一步 声明一个定时任务 -->
	<bean id="clock" class="com.bestsoft.base.test.Clock"></bean> 
	<!-- 第二步 调度定时任务,把声明的定时任务注入进来,并设置定时参数 --> 
	<bean id="scheduledClock" class="org.springframework.scheduling.timer.ScheduledTimerTask">
		<property name="timerTask">
			<ref bean="clock"/>
		</property>
		<property name="period">
			 <!--这里是每隔多长时间就进行一次计时任务,单位ms-->
			<value>5000</value>
		</property>
		<property name="delay">
			<!--这里是服务启动后延时多少时间,开始计时任务,单位ms-->
			<value>5000</value>
		</property>
	</bean>
	
	<!-- 启动定时任务,如果有多个定时任务,则重复步骤一,二,然后把第二步设置的beany放在下面的list列表中.此方法不能精确几点运行定时任务 -->  
	<bean class="org.springframework.scheduling.timer.TimerFactoryBean">  
		<property name="scheduledTimerTasks">  
			<list>  
				<ref bean="scheduledClock"></ref>  
			</list>  
		</property>  
	</bean> 
	
	
	<!-- 第二种方式  通过quartz来实现任务的精确调度 -->
	<!-- 第一步 声明一个定时任务,注意不是直接声明,而是声明一个JobDetailBean,通过jobClass属性设置一个定时对象 -->
	<bean id="quartzClock" class="org.springframework.scheduling.quartz.JobDetailBean">
		<property name="jobClass">
			<value>com.bestsoft.base.test.QuartzClock</value>
		</property>
	</bean>
	
	<!-- 第二步 调度定时任务 -->
	<!-- 调度定时任务 第一种方式  -->
	 <bean id="quartzClockTask" class="org.springframework.scheduling.quartz.SimpleTriggerBean">
	 	<property name="jobDetail">
	 		<ref bean="quartzClock"/>
	 	</property>
	 	<property name="startDelay">
	 		<!--这里是每隔多长时间就进行一次计时任务,单位ms-->
	 		<value>6000</value>
	 	</property>
	 	<property name="repeatInterval">
	 		<!--这里是服务启动后延时多少时间,开始计时任务,单位ms-->
	 		<value>6000</value>
	 	</property>
	 </bean>
	
	<!-- 调度定时任务 第二种方式  该种配置方式可以实现精确调度 -->
	<bean id="cronQuartzClock" class="org.springframework.scheduling.quartz.CronTriggerBean">
		<property name="jobDetail">
	 		<ref bean="quartzClock"/>
	 	</property>
	 	<property name="cronExpression">
	 		<value>0 19,20,21,23 18 * * ?</value>
	 			<!-- 一个cron表达式有到少6个(也可能是7个)由空格分隔的时间元素.从左到右,这些元素的定义如下:  
					1.秒(0-59)  
					2.分钟(0-59)  
					3.小时(0-23)  
					4.月份中的是期(1-31)  
					5.月份(1-12或SUN-DEC)  
					6.星期中的日期(1-7或SUN-SAT)  
					7.年份(1970-2099)   
				例子:  
					0 0 10,14,16 * * ? 每天上午10点,下午2点和下午4点  
					0 0,15,30,45 * 1-10 * ? 每月前10天每隔15分钟  
					30 0 0 1 1 ? 2012 在2012年1月1日午夜过30秒时  
					0 0 8-5 ? * MON-FRI 每个工作日的工作时间  
					- 区间  
					* 通配符  
					? 你不想设置那个字段  
				-->  
	 	</property>
	</bean>
	
	<!--第三步 启动定时任务,注意这里的ref bean -->
	<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
		<property name="triggers">
			<list>
				<ref bean="cronQuartzClock"/>
			</list>
		</property>
	</bean>
</beans>


 

在测试类里面,我们通过读取配置文件,可以看到运行效果:

public class test {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
		//ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
	}
}


 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值