今天在做一个spring配置定时器的任务时,发现定时器并没有启动。
但是所有的定时器spring的配置代码是毫无错误的:
<bean id="timerBeanId" class="timerBean">
</bean>
<bean id="scheduleReportTask" class="org.springframework.scheduling.timer.ScheduledTimerTask">
<property name="timerTask" ref="timerBeanId" />
<property name="period">
<value>10000</value>
</property>
</bean>
<bean class="org.springframework.scheduling.timer.TimerFactoryBean">
<property name="scheduledTimerTasks">
<list>
<ref bean="scheduleReportTask"/>
</list>
</property>
</bean>
因为同样的配置我放到了其他项目里面可以运行调通。那问题就不是定时器配置的问题了,问题在于项目框架本身。
问题解决流程:
1.我以debugger模式启动服务(部署到tomcat中),在定时器run()方法上加上断点,没有执行
2.通过上一步说明定时器没有一执行的timertask中,接着在timertask类中添加无参构造,并打印信息。因为timerTask是通过spring配置文件进行初始化的,我要看看是否在服务启动的时候bean进行了初始化,结果还是没有执行。
3.通过上一步说明spring并没有初始化相应的bean类,为了证实这个结果,我在其他的bean的无参构造函数中同样加打印信息,结果还是没有打印出结果。
4.问题渐渐明朗起来,就是在服务启动的时候没有启动spring。最后发现web.xml中没有配置spring的启动Listener
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
加上此listener后服务启动,spring初始化bean然后定时器执行