概述
近期项目中,用 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() 方法中实现资源释放)
参考:
最后
以上就是糟糕毛豆为你收集整理的tomcat 停止 java 线程不停止_Tomcat热部署,Web工程中线程没有终止的全部内容,希望文章能够帮你解决tomcat 停止 java 线程不停止_Tomcat热部署,Web工程中线程没有终止所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复