系統有一個配置表,系統在啓動後會啓動一個線程,每隔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)線程