Tomcat熱部署,Web工程中線程沒有終止


近期項目中,用 jenkins 熱部署 web工程時,發現工程中靜態持有的線程(將ScheduledExecutorService定時任務存儲在靜態Map中),導致不定時出現數據庫訪問事務關閉異常,如下:org.springframework.transaction.CannotCreateTransactionException: Could not open JPA EntityManager for transaction; nested exception is java.lang.IllegalStateException: EntityManagerFactory is closed

看到該問題,一直認為是操作數據庫的類沒有事務聲明,所以在類上加上@Transactional,但沒生效。並且程序不定期的調用工程中的Runnable類,然后報以上錯誤。明明只有一個線程,卻出現多個線程運行,猜想應該是之前熱部署時,存儲在靜態資源中的定時線程沒有清除。重啟Tomcat,發現不會報錯了。故定位為Tomcat熱部署,靜態資源為釋放。

猜想:遺留線程未釋放,仍在運行,此時操作數據庫,出現創建事務失敗的異常,應該是web工程熱部署后,Spring的事務管理已失效,無法創建事務。

解決方法

(1)使用Java EE5中的注解@PreDestroy

(2)使用Spring中的DisposableBean或配置destroy-method。(類實現 DisposableBean 接口,在 destroy() 方法中實現資源釋放)

參考:

深入理解 Spring 事務原理

Spring事務管理詳解

透徹的掌握 Spring 中@transactional 的使用

jenkins tomcat熱部署,任務線程重復啟動的解決方法

注解@PostConstruct與@PreDestroy詳解及實例

Spring@PostConstruct和@PreDestroy實例

Spring Bean InitializingBean和DisposableBean實例  

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM