System.out に出力するだけの単純な TimerTask 実装があります。
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秒ごとに実行されるはずです。システムアウトから明らかなように、それは実行しますが、実行ごとに2回実行します
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: Matt によって疑われるように、hashCode を追加すると、RefreshUserAndOLStatsJob の 2 つの別個のインスタンスがあります。アプリケーション コンテキストが実際に 2 回初期化されているようです。
アプリコンテキストxmlのrefreshUserAndOLStatsJobの初期化については明示的に宣言していませんが、RefreshUserAndOLStatsJobは@Componentのマークが付いたクラスなので、Springが自動でロードできるようです。