java web结束线程_Web进程被kill掉后线程还在运行怎么办?

背景描述

系统有一个配置表,系统在启动后会启动一个线程,每隔5分钟将配置表里所有的数据更新到内存中。

系统是通过jenkins构建(直接kill掉Web进程,然后传入新的包再启动)的,每次在jenkins在构建系统后的5分钟内,系统都会报一次错:

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.(AbstractSharedSessionContract.java:143)

at org.hibernate.internal.AbstractSessionImpl.(AbstractSessionImpl.java:29)

at org.hibernate.internal.SessionImpl.(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进程的时候停掉。

处理方案

1)使用Java EE5中的注解@PreDestroy;尝试过,没成功

2)使用Spring中的DisposableBean或配置destroy-method。(类实现 DisposableBean 接口,在 destroy() 方法中实现资源释放)使用该方式成功

参考

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值