Spring 定时器的简单实现
最近作业中需要实现以下功能:
1. 图书到期前提醒;
2. 图书如果过期每天需要扣N元钱。
3. 如果过期超过M天则锁定改账户。
这3个需求其实都是定时任务,项目架构是SSH,Spring框架支持Java 的Timer类,用来实现上述功能非常简单。
首先实现我们继承java.util.TimerTask类实现run方法
public class CheckExpiredTask extends TimerTask {
private BorrowDao borrowDao;
public BorrowDao getBorrowDao() {
return borrowDao;
}
public void setBorrowDao(BorrowDao borrowDao) {
this.borrowDao = borrowDao;
}
@Override
public void run() {
System.out.println("开始检测图书列表.....");
List<borrow> bl = borrowDao.getBorrowList();
for (Borrow borrow : bl) {
System.out.println(borrow.getBookId());
//...检测每一本书是否有过期
}
}
}
接下来配置Spring定时器
<bean id="scheduledTask" class="org.springframework.scheduling.timer.ScheduledTimerTask">
<property value="5000" name="delay"></property>
<property value="100000" name="period"></property>
<property name="timerTask" ref="checkExpiredTask"></property>
</bean>
这里delay是指多久后(毫秒)开始执行这个timerTask,value指每隔多久run一次,timerTask指向我们刚才写的任务类。
配置TimerFactoryBean
<bean id="timerFactory" class="org.springframework.scheduling.timer.TimerFactoryBean">
<property name="scheduledTimerTasks">
<list>
<ref bean="scheduledTask"></ref>
</list>
</property>
</bean>
TimerFactoryBean允许我们指定一个或多个ScheduledTimerTasks,java.util.Timer的实例就是由它创建和管理的。
定义任务bean
<bean id="checkExpiredTask" class="com.bjtu.lms.util.CheckExpiredTask">
<property name="borrowDao">
<ref local="borrowDao" />
</property>
</bean>
和定义一般bean一样,你可以在这里使用AOP和注入其他类。
很简单就实现了循环任务,不过Timer不支持定时启动任务,如果有更复杂的需求,可以使用Quartz Scheduler,我暂时用不到,就不研究了。。。