应用服务器重新部署后解除锁定的解决方案

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 孤立案例的可能性。

并且进程 20578htop 显示:

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();
}