有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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) 个答案

  1. # 1 楼答案

    解决方案是,Java应用程序查找锁定文件的进程,然后执行kill -15信号,例如,让Java优雅地处理该信号,以便能够关闭环境:

    // Get all PersistentEntityStore's
    entityStoreMap.forEach((dir, entityStore) -> {
       entityStore.getEnvironment().close();
       entityStore.close();
    }