Автоматическое развертывание Tomcat иногда взрывается только частичной войной

Часть нашего процесса управления веб-приложением заключается в создании WAR в каталоге Dropbox, который используется совместно с нашим веб-сервером (работающим в Amazon EC2). У нас есть сценарий .NET, работающий на веб-сервере, который следит за появлением файлов WAR в папке Dropbox, а затем перемещает их (не копирует) в папку веб-приложений Tomcat. Соответствующий бит кода .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 Foundation\Tomcat 8.0\webapps" -force
            Write-Host "WAR file moved to deployment directory."
          }  

Обычно это работает нормально, но время от времени Tomcat не может взорвать всю WAR, в результате чего веб-сайт будет поврежден (например, отсутствует index.html). Некоторые файлы и папки есть, но не все. Простое удаление папки развертывания и повторное развертывание Tomcat решает проблему (так что это показывает, что все файлы находятся в WAR, который был перемещен).

Думаю, я на самом деле не знаю, (1) Tomcat не удалось очистить все файлы предыдущего развертывания и вообще НЕ взорвался, или (2) он не извлек все файлы WAR.

Любая идея, что может вызвать такое поведение?


person user3191192    schedule 17.01.2018    source источник
comment
я предполагаю, что tomcat начал использовать файл до того, как он был полностью записан в папку, есть ли какие-либо журналы в tomcat с указанием на что-то не так?   -  person awd    schedule 17.01.2018


Ответы (1)


На случай, если кто-то еще столкнется с этой конкретной ситуацией, я, наконец, нашел ключевое сообщение журнала, которое дало ключ к разгадке, не удалось развернуть из-за кода, который не закрывал файл:

org.apache.catalina.startup.HostConfig.undeploy Undeploying context []
[ContainerBackgroundProcessor[StandardEngine[Catalina]]] org.apache.catalina.startup.ExpandWar.deleteDir [C:\Program Files (x86)\Apache Software Foundation\Tomcat 8.0\webapps\ROOT\WEB-INF\classes\com\...\web\templates] 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() для автоматического закрытия решило проблему.

person user3191192    schedule 17.01.2018