雄猫自动部署有时只会爆炸部分战争



我们的 Web 应用程序管理流程的一部分是在与我们的 Web 服务器(在 Amazon EC2 中运行(共享的 Dropbox 目录上创建 WAR。我们在 Web 服务器上运行了一个 .NET 脚本,该脚本监视 WAR 文件是否出现在 Dropbox 文件夹中,然后将它们(而不是复制(移动到 Tomcat webapps 文件夹中。.NET 代码的相关位是:

$action = { $path = $Event.SourceEventArgs.FullPath
            $changeType = $Event.SourceEventArgs.ChangeType
            Write-Host "Found new WAR file: $path"
            ### Wait until file is not in use, e.g. copy/move is complete
            while (!(IsFileAccessible $path)) {
              Write-Host "Waiting for WAR file to be unused."
              Start-Sleep -s 10
            }
            ### Move the new WAR file to the server deployment folder.
            ### Tomcat will detect the new file and deploy it automatically.
            Move-Item "$path" "C:Program Files (x86)Apache Software FoundationTomcat 8.0webapps" -force
            Write-Host "WAR file moved to deployment directory."
          }  

通常这工作正常,但偶尔Tomcat无法爆炸整个WAR,使网站瘫痪(例如缺少索引.html(。一些文件和文件夹在那里,但不是全部。只需删除部署文件夹并让 Tomcat 再次部署即可解决问题(因此这表明所有文件都在被移动的 WAR 中(。

我想我实际上不知道 (1( Tomcat 是否未能清理先前部署的所有文件并且根本没有爆炸,或者 (2( 它没有提取 WAR 的所有文件。

知道什么会导致这种行为吗?

万一其他人遇到这种特殊情况,我终于找到了提供线索的关键日志消息,由于代码未关闭文件,取消部署失败:

org.apache.catalina.startup.HostConfig.undeploy Undeploying context []
[ContainerBackgroundProcessor[StandardEngine[Catalina]]] org.apache.catalina.startup.ExpandWar.deleteDir [C:Program Files (x86)Apache Software FoundationTomcat 8.0webappsROOTWEB-INFclassescom...webtemplates] could not be completely deleted. The presence of the remaining files may cause problems

有问题的 Java 代码:

InputStream in = Util.class.getClassLoader().getResourceAsStream("/com/.../web/templates/"+templateName)

而且溪流从未关闭。将其放入 try(( 中以自动关闭解决了问题。

最新更新