定時任務伺服器不定時重啟原因解析

來源:互聯網
上載者:User

標籤:des   style   blog   color   io   for   ar   2014   

現在定時任務服務存在問題,請幫忙核實一下: 現象:定時任務伺服器的resin不定時重啟,有時能達到一天一兩次,原因是在建立單例bean時,單例bean正在被銷毀。報錯的類都是RunPickupPathService,每次重啟前都會報如下錯誤。 日誌如下: Caused by: org.springframework.beans.factory.BeanCreationNotAllowedException: Error creating bean with name ‘transactionManager‘: Singleton bean creation not allowed while the singletons of this factory are in destruction (Do not request a bean from a BeanFactory in a destroy method implementation!) [INFO]2014-08-15 15:46:27 INFO [resin-shutdown] org.springframework.scheduling.concurrent.ExecutorConfigurationSupport.shutdown(150) | Shutting down ExecutorService ‘taskExecutor‘ 
<!-- 定時檢查撿貨路徑不完整的, 是否有補貨進來, 如果補貨了,則重新跑撿貨路徑 -->    <bean id="xsaCheckUnCompletePathIsSupplied" class="org.springframework.scheduling.quartz.CronTriggerBean">       <property name="jobDetail">            <ref bean="xsaCheckUnCompletePathIsSuppliedJobDetail"/>       </property>       <property name="cronExpression">            <value>${checkUnCompletePathIsSuppliedCron}</value>       </property>    </bean>    <bean id="xsaCheckUnCompletePathIsSuppliedJobDetail" class="springframework.scheduling.quartz.BeanInvokingJobDetailFactoryBean">        <property name="targetBean" value="runPickupPathService" />        <property name="targetMethod" value="checkUnCompletePathIsSupplied" />    </bean>    <!-- 對於所有沒有跑的撿貨路徑,進行跑撿貨路徑工作 -->    <bean id="xsaRunUnRunPickupPath" class="org.springframework.scheduling.quartz.CronTriggerBean">       <property name="jobDetail">            <ref bean="xsaRunUnRunPickupPathJobDetail"/>       </property>       <property name="cronExpression">            <value>${runUnRunPathCron}</value>       </property>    </bean>    <bean id="xsaRunUnRunPickupPathJobDetail" class="springframework.scheduling.quartz.BeanInvokingJobDetailFactoryBean">        <property name="targetBean" value="autoRunPickupPathService" />        <property name="targetMethod" value="runAllUnRunPickupPath" />    </bean>
 這裡targetBean autoRunPickupPathService 引用了如下的service,而 runPickupPathService 本身又是定時任務service,在跑完定時任務的時候需要被destory。 
@Servicepublic class AutoRunPickupPathService {        private final static Logger logger = LoggerFactory.getLogger(RunPickupPathService.class);    @Resource    private RunPickupPathService runPickupPathService;    @Resource    private XsaPickupPathMapper xsaPickupPathMapper;    /**     * 對於所有沒有跑撿貨路徑的單據,跑撿貨路徑, 此方法設定為定時     * @throws Exception      */    public void runAllUnRunPickupPath() {        synchronized (RunPickupPathService.class) {            List<XsaPickupPath> pathList = xsaPickupPathMapper.getAllUnRunPickUpPath();            if(null != pathList && pathList.size() > 0) {                for(XsaPickupPath p : pathList) {                    try {                        runPickupPathService.runPickupPath(p.getServiceno(), true);                    } catch (Exception e) {                        logger.error("Auto Run Pickup Path Error, Transfer NO: " + p.getServiceno() + ", " + e.getMessage());                    }                }            }        }    }}

 

出現這種情況是下面情形,按時間先後出現如下 1->2->3->4 1、autoRunPickupPathService 已經運行結束,目前時間只有runPickupPathService 在運行。2、runPickupPathService 運行完畢,發現此時沒有別的類在引用自己,於是開始執行對bean的銷毀(由spring控制,調用destory方法,不整合spring則由GC回收)。3、在 runPickupPathService 正在銷毀但銷毀未完成的時候,定時任務 autoRunPickupPathService開始執行,由於類中引用了runPickupPathService ,於是開始建立runPickupPathService的執行個體。4、由於spring的bean預設情況下都是單例(singleton),導致出現如上報錯,即 Singleton bean creation not allowed while the singletons of this factory are in destruction 。 最終解釋可以歸為一句話:定時任務的相互調用會導致單例bean出現混亂。 解決方案:去掉定時任務之間的調用。 這是我分析的原因,我檢測的三次重啟都是由這個定時任務建立bean失敗導致。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.