Web進程被kill掉後線程還在運行怎麼辦?

背景描述

系統有一個配置表,系統在啓動後會啓動一個線程,每隔5分鐘將配置表裏全部的數據更新到內存中。
系統是經過jenkins構建(直接kill掉Web進程,而後傳入新的包再啓動)的,每次在jenkins在構建系統後的5分鐘內,系統都會報一次錯:java

Caused by: java.lang.IllegalStateException: EntityManagerFactory is closed
    at org.hibernate.internal.SessionFactoryImpl.validateNotClosed(SessionFactoryImpl.java:531)
    at org.hibernate.internal.SessionFactoryImpl.getCache(SessionFactoryImpl.java:830)
    at org.hibernate.internal.AbstractSharedSessionContract.<init>(AbstractSharedSessionContract.java:143)
    at org.hibernate.internal.AbstractSessionImpl.<init>(AbstractSessionImpl.java:29)
    at org.hibernate.internal.SessionImpl.<init>(SessionImpl.java:254)
    at org.hibernate.internal.SessionFactoryImpl$SessionBuilderImpl.openSession(SessionFactoryImpl.java:1290)
    at org.hibernate.internal.SessionFactoryImpl.openSession(SessionFactoryImpl.java:482)

緣由分析

基於每次經過jenkins構建後系統只報一次異常和具體的堆棧信息,判斷是更新配置信息到內存的線程沒有在kill掉Web進程的時候停掉。ui

處理方案

1)使用Java EE5中的註解@PreDestroy;嘗試過,沒成功
2)使用Spring中的DisposableBean或配置destroy-method。(類實現 DisposableBean 接口,在 destroy() 方法中實現資源釋放)使用該方式成功hibernate

參考

Tomcat熱部署,Web工程中線程沒有終止(https://www.cnblogs.com/shuimuzhushui/p/8490619.html)線程

相關文章
相關標籤/搜索