最近做的项目需要调用别人写的接口,而接口使用OAuth2.0进行授权,里面的token值会在一段时间内就过期,所以想着写一个定时器,每隔一段时间自动刷新一下token的值,这样就可以避免token值过期了。

原本想着直接写个线程,设置过期时间,后来发现spring自带定时器,通过一些简单的配置就可以实现定时器的功能,因为我做的项目本身就是使用的spring框架,最终决定使用spring自带的定时器。

在网上找了一些例子,根据一些介绍进行配置,但结果却有些差强人意,一直报一些错,经过一系列的调试最终程序可以正常运行了,特此记录一下,以后就可以直接拿来用了。

第一步在applicationContext.xml文件中配置如下代码:


<!-- 定时器 具体要执行任务的类,这里的方法需要自己手动写 -->
<bean id="refreshTokenTimer" class="org.ipph.timer.RefreshTokenTimer"></bean>
<!-- 定时器配置,主要是指定任务类和任务方法,当然也可以设置其它属性 -->
<bean id="timeDitail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject" ref="refreshTokenTimer"></property><!-- 指定任务类 -->
<property name="targetMethod" value="execute"></property><!-- 指定任务方法 -->
<property name="concurrent" value="false" /><!-- 如果前一个任务还没有结束第二个任务不会启动 false -->
</bean>
<!-- 定义时间间隔触发器 使用CronTriggerFactoryBean,而非CronTriggerBean,与jar包版本有关   -->
<bean id="timeTigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
<property name="jobDetail" ref="timeDitail"></property>
<property name="cronExpression">
<value>0/3 * * * * ?</value> <!-- 每隔3秒钟触发一次 -->
</property>
</bean>
<!-- 启动定时器 autowire="no" 不能缺少,否则会报找不到qrtz_triggers表的错误-->
<bean id="startJob" autowire="no" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref bean="timeTigger"/>
</list>
</property>
</bean>
第二步在maven的配置文件pom.xml中加入相应依赖信息(相当于一般web项目添加jar包):
<properties> <!-- 设置版本号 -->
<log4j.version>1.2.17</log4j.version>
 <springframework.version>4.2.5.RELEASE</springframework.version>
 <quartz.version>2.2.1</quartz.version>
 </properties>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${springframework.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>${springframework.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>${springframework.version}</version>
</dependency>
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>${quartz.version}</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>${log4j.version}</version>
</dependency>
<dependency>
 <groupId>org.slf4j</groupId>
 <artifactId>slf4j-api</artifactId>
 <version>1.6.3</version>
</dependency>
<dependency>
 <groupId>org.slf4j</groupId>
 <artifactId>slf4j-log4j12</artifactId>
 <version>1.6.3</version>
 <scope>test</scope>
</dependency>

Ps:将slf4j-api-1.6.3.jar和slf4j-log4j12-1.6.3.jar这两个依赖添加进入,否则会报找不到方法的错,主要是因为jar包版本造成的冲突,需要1.6以上的版本。将jar包引入之后,在重启tomcat之前,需要先将项目clean一下,否则会因为之前引入的jar包与新引入的jar包版本冲突,而造成不必要的错误。


第三步编写自己的业务方法RefreshTokenTimer,系统会默认执行 execute方法

package org.ipph.timer;
/**
 * 定时器:每隔3秒打印一次信息
 */
public class RefreshTokenTimer{
public void execute(){
System.out.println("***************************************");
}
}