java解决方案,用于在应用程序服务器重新部署后解除锁定
在重新部署应用程序war之前,我检查了xd。来自以下环境路径之一的lck文件:
Private property of Exodus: 20578@localhost
jetbrains.exodus.io.LockingManager.lock(LockingManager.kt:89)
我正在从Nginx单元和Payara服务器进行测试,以消除这种可能性,即这是单元的一个孤立案例
和过程20578
显示自htop:
20578 root 20 0 2868M 748M 7152 S 0.7 75.8 14:05.75 /usr/lib/jvm/zulu-8-amd64/bin/java -cp /
重新部署成功完成后,访问web应用程序将抛出:
java.lang.Thread.run(Thread.java:748)
at jetbrains.exodus.log.Log.tryLock(Log.kt:799)
at jetbrains.exodus.log.Log.<init>(Log.kt:120)
at jetbrains.exodus.env.Environments.newLogInstance(Environments.java:142)
at jetbrains.exodus.env.Environments.newLogInstance(Environments.java:121)
at jetbrains.exodus.env.Environments.newLogInstance(Environments.java:10
检查相同的xd.lck
文件会显示相同的内容。意思是说“锁不会立即释放”,与described here相反
对于Payara服务器(基于Glassfish)的这种特定情况,我的假设是,即使在重新部署完成后,服务器也不会终止前一个进程。也许对于“零停机”重新部署,不确定,Payara专家可以在这里纠正我
使用htop检查进程20578
即使在重新部署后仍在运行
与Xodus一样,由于大多数应用程序服务器都是这样运行的,什么是最好的解决方案和/或解决方案,这样我们就不需要在每次重新部署时手动删除每个环境的所有锁文件(如果可以删除的话)强>
# 1 楼答案
解决方案是,Java应用程序查找锁定文件的进程,然后执行
kill -15
信号,例如,让Java优雅地处理该信号,以便能够关闭环境: