问题描述
在重新部署应用程序之前,我从以下环境路径之一检查了xd.lck文件:
Private property of Exodus: 20578@localhost
jetbrains.exodus.io.LockingManager.lock(LockingManager.kt:89)
我正在Nginx Unit和Payara服务器上进行测试,以消除这是Unit的孤立案例的可能性。
然后流程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 Server(基于Glassfish)的这种特定情况,即使重新部署完成后,该服务器也不会终止先前的进程。也许不确定“零停机时间”的重新部署,Payara专家可以在这里纠正我。
使用htop检查进程20578
仍在运行,即使在重新部署之后。
与Xodus一样,由于大多数应用程序服务器都采用这种方式,因此什么是最佳解决方案和/或解决方法,因此我们不需要手动删除每个环境的所有锁定文件(如果可以删除)。我们什么时候重新部署?
解决方法
解决方案是让 Java 应用程序查找锁定文件的进程,然后执行 kill -15
信号,例如优雅地让 Java 处理信号以能够关闭环境:
// Get all PersistentEntityStore's
entityStoreMap.forEach((dir,entityStore) -> {
entityStore.getEnvironment().close();
entityStore.close();
}