我有一个简单的 TimerTask 实现,它只打印到 System.out
public class RefreshUserAndOLStatsJob extends TimerTask {
public void run() {
System.out.println("RefreshUserAndOLStatsJob running at: " + new Date(this.scheduledExecutionTime()));
}
}
它在 Spring 应用程序上下文中配置如下
<bean id="refreshUserAndOLStatsTask" class="org.springframework.scheduling.timer.ScheduledTimerTask">
<!-- run every 30 secs -->
<property name="period" value="30000" />
<property name="timerTask" ref="refreshUserAndOLStatsJob" />
</bean>
<bean class="org.springframework.scheduling.timer.TimerFactoryBean">
<property name="scheduledTimerTasks">
<list>
<ref local="refreshUserAndOLStatsTask" />
</list>
</property>
</bean>
它应该每 30 秒运行一次。它会这样做,但每次运行都会这样做两次,这从系统输出中可以看出
RefreshUserAndOLStatsJob running at: Thu Feb 14 20:59:01 IST 2013
RefreshUserAndOLStatsJob running at: Thu Feb 14 20:59:02 IST 2013
RefreshUserAndOLStatsJob running at: Thu Feb 14 20:59:31 IST 2013
RefreshUserAndOLStatsJob running at: Thu Feb 14 20:59:32 IST 2013
RefreshUserAndOLStatsJob running at: Thu Feb 14 21:00:01 IST 2013
RefreshUserAndOLStatsJob running at: Thu Feb 14 21:00:02 IST 2013
RefreshUserAndOLStatsJob running at: Thu Feb 14 21:00:31 IST 2013
RefreshUserAndOLStatsJob running at: Thu Feb 14 21:00:32 IST 2013
RefreshUserAndOLStatsJob running at: Thu Feb 14 21:01:01 IST 2013
RefreshUserAndOLStatsJob running at: Thu Feb 14 21:01:02 IST 2013
RefreshUserAndOLStatsJob running at: Thu Feb 14 21:01:31 IST 2013
有人能猜出为什么会这样。
编辑 1:我在 Tomcat7
编辑 2:在添加 hashCode 时,正如 Matt 所怀疑的那样,有 2 个单独的 RefreshUserAndOLStatsJob 实例。似乎应用程序上下文确实被初始化了两次。
至于refreshUserAndOLStatsJob在application context xml中的初始化,并没有显式声明,但是因为RefreshUserAndOLStatsJob是一个标记为@Component的类,看来Spring可以自动加载。