问题描述:部分quartz定时任务没有启动。
定时任务:
<!--设置调度 总管理类 如果将lazy-init='false'那么容器启动就会执行调度程序 --> <bean id="startQuertz" lazy-init="false" autowire="no" class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> <property name="triggers"> <list> <ref bean="pushRouteTrigger"/> <ref bean="sendJcIm1Time" /> <ref bean="sendJcIm2Time" /> <ref bean="sendCloseOrderTime" /> <ref bean="sendOrderTime" /> <ref bean="sendWayBillTime" /> <ref bean="receiveBackInfoByMftNoTime" /> <ref bean="sendPayConfirmTime" /> <ref bean="sendProductIdTime" /> <ref bean="sendAccountBuyerTime" /> </list> </property> <property name="taskExecutor" ref="executor" /> </bean>
思路:此问题不难排查,跟踪下spring集成quartz的源码即可。
环境准备:idea导入eclipse项目,然后关联spring源码的jar包即可调试。(第一次用idea调试生产问题,感觉还不错)
通过调试SchedulerFactoryBean类的afterPropertiesSet()方式最终发现问题:XML配置文件中有两个bean id为“startQuertz”的SchedulerFactoryBean. 导致其中一个FactoryBean初始化后,另外一个就不初始化啦,因为spring默认是单例的。----这你妹,完全是有人代码乱copy的结果。