应用服务器重新部署后解除锁定的解决方案
Solution to remove lock after Application server redeployment
在重新部署应用程序 war 之前,我从环境路径之一检查了 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 一样,由于大多数应用程序服务器都是这种行为,什么是最佳解决方案and/or 解决方法,因此我们不需要手动删除每个环境的所有锁定文件(是否可以删除)每次重新部署?
解决方案是 Java 应用程序查找锁定文件的进程,然后执行 kill -15
信号,例如优雅地使 Java 处理信号,以便能够关闭环境:
// Get all PersistentEntityStore's
entityStoreMap.forEach((dir, entityStore) -> {
entityStore.getEnvironment().close();
entityStore.close();
}
在重新部署应用程序 war 之前,我从环境路径之一检查了 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 一样,由于大多数应用程序服务器都是这种行为,什么是最佳解决方案and/or 解决方法,因此我们不需要手动删除每个环境的所有锁定文件(是否可以删除)每次重新部署?
解决方案是 Java 应用程序查找锁定文件的进程,然后执行 kill -15
信号,例如优雅地使 Java 处理信号,以便能够关闭环境:
// Get all PersistentEntityStore's
entityStoreMap.forEach((dir, entityStore) -> {
entityStore.getEnvironment().close();
entityStore.close();
}