Shi Kai Lun 的日志

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,我暂时用不到,就不研究了。。。

Posted on
This entry was posted in technology  and tagged Spring  后端