3

我有一个简单的 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可以自动加载。

4

0 回答 0