3

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が自動でロードできるようです。

4

0 に答える 0