项目需要实现由用户设定定时发送通知的功能,为了实现动态设定定时执行任务,我用了以下方式:首先配置scheduler
<task:annotation-driven scheduler="scheduler" />
<task:scheduler id="scheduler" />
然后再建立类如下:
@Component("notificationBatchJobs")
public class NotificationBatchJobs implements InitializingBean {
@Autowired
private LateNotificationReceiveTimeDao receiveTimeDao;
@Autowired
private TaskScheduler scheduler;
@SuppressWarnings("rawtypes")
private ScheduledFuture future;
public void cancelTask() {
if (future != null) {
future.cancel(true);
}
}
public void startTask(String cronTime) {
future = scheduler.schedule(new SchedulSendNotificationTask(),
new CronTrigger(cronTime));
}
@Override
public void afterPropertiesSet() throws Exception {
startTask("0 1 12 * * ?");
}
private class SchedulSendNotificationTask implements Runnable {
@Override
public void run() {
System.err.println(" do something ");
}
}
}
startTask方法是每天12点01分执行run方法。
问题:只执行了一次,次日没有执行。比如今天27号12点01分执行了run方法,然后我修改本地计算机的时间,改为28号12点00分,待到01分的时候却没有执行run方法,请问是为何呢?
spring定时器是有自己内部的计时器的,只有开始计时的时候获取一次本地时间,便开始以自己的计时器进行计时,而不会再次读取本地计算机的时间,所以修改本地计算机时间是没有效果的。