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

问题描述

在重新部署应用程序之前,我从以下环境路径之一检查了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();
}