Перезапуск встроенного сервера Tomcat 7
Мы используем встроенный Tomcat 7 для размещения веб-приложения.
Это работает очень хорошо, за одним небольшим исключением.
Причина, по которой мы используем встроенный Tomcat, заключается в том, что нам нужно работать на нескольких платформах, и наш архитектор сделал это.
Эта проблема
Мы хотели бы предоставить нашим пользователям возможность проверять наличие обновлений WAR во время работы Java-приложения оболочки / контейнера (обновление в режиме реального времени). В настоящее время они должны перезапустить наше приложение, что гораздо менее желательно.
По сути, наш код просто проверяет наличие новых файлов WAR на удаленном сервере, если они существуют, они загружаются. Проблема в том, что мы не можем заставить сервер Tomcat завершить работу или снять блокировку, которую он имеет для развернутых папок WAR.
Если мы полностью уничтожим экземпляр Tomcat, то мы сможем развернуть файлы WAR и удалить разнесенные папки WAR, но Tomcat не сможет их разложить и разместить, пока мы полностью не уничтожим JAVA-приложение-оболочку / контейнер и не запустим его заново. После того, как мы перезапустим, Tomcat взрывает файлы WAR и прекрасно размещает приложения.
Что я ищу
Я надеюсь, что есть способ либо развернуть обновляемое приложение, либо правильно отключить / остановить сервер Tomcat.
Пример кода
Я упростил приведенный ниже пример кода, не включая реализацию для загрузки, так как это работает нормально.
Экземпляр Tomcat не является общедоступным, он просто создан для простоты использования. Кроме того, сон в потоке был просто добавлен, чтобы упростить пример.
Бесконечный цикл был просто вставлен для этого образца.
import org.apache.catalina.startup.Tomcat;
import org.apache.catalina.Context;
import org.apache.catalina.Globals;
import org.apache.catalina.LifecycleState;
import org.apache.catalina.loader.WebappLoader;
import org.apache.catalina.startup.Tomcat;
...
public class Testing123
{
public static void main(String[] args)
{
final Testing123 test = new Testing123();
test.createTomcat();
test.downloadUpdate();
(new Thread())
{
public void run()
{
Thread.sleep(10000);
test.downloadUpdate();
}
}.start();
while (true)
{
// this loop is just for this example...
}
}
public Tomcat tomcat = null;
private String webappsPath = "c:\\tomcat\\webapps";
private void createTomcat()
{
this.tomcat = new Tomcat();
this.tomcat.setBaseDir(this.webappsPath);
this.tomcat.setPort("5959");
this.tomcat.getServer().setPort("5960");
this.tomcat.getServer().setShutdown("SHUTDOWN");
this.tomcat.getHost().setCreateDirs(true);
this.tomcat.getHost().setDeployIgnore(null);
this.tomcat.getHost().setDeployOnStartup(true);
this.tomcat.getHost().setAutoDeploy(true);
this.tomcat.getHost().setAppBase(this.webappsPath);
Context ctx = this.tomcat.addWebapp(null, "/app1", "APP1");
ctx.setLoader(new WebappLoader(Testing123.class.getClassLoader()));
ctx.setReloadable(true);
}
private boolean isTomcatRunning()
{
if ((this.tomcat == null) || (LifecycleState.STARTED == this.tomcat.getServer().getState()))
{
return true;
}
return false;
}
private void shutdownTomcat() throws Exception
{
if (this.isTomcatRunning())
{
if ((this.tomcat!= null) && (this.tomcat.getServer() != null))
{
this.tomcat.stop();
while ((LifecycleState.STOPPING == this.tomcat.getServer().getState()) || (LifecycleState.STOPPING_PREP == this.tomcat.getServer().getState()))
{
// wait for the server to stop.
}
}
}
}
private void startTomcat() throws Exception
{
if (this.isTomcatRunning())
{
if ((this.tomcat!= null) && (this.tomcat.getServer() != null))
{
try
{
this.tomcat.init();
while (LifecycleState.INITIALIZING == this.tomcat.getServer().getState())
{
// wait for the server to initialize.
}
}
catch (Throwable e)
{
// ignore
}
this.tomcat.start();
while ((LifecycleState.STARTING == this.tomcat.getServer().getState()) || (LifecycleState.STARTING_PREP == this.tomcat.getServer().getState()))
{
// wait for the server to start.
}
}
}
}
private void downloadUpdate()
{
this.shutdownTomcat();
// Download the WAR file and delete the exploded WAR folder...
this.startTomcat();
}
}