2010-11-15 1 views
0

Сценарий:Stop Apache Tomcat, когда веб-приложение перестает

Apache Tomcat 6.0 запускается как служба на Windows Server 2008 R2 с помощью оболочки (org.tanukisoftware.wrapper.WrapperStartStop), который использует org.apache.catalina.startup.Bootstrap. В ходе запуска Tomcat также запускается одно веб-приложение. Это веб-приложение необходимо подключиться к удаленной базе данных и проверить соединение. Он повторяет попытку подключения пару раз, если база данных недоступна, а затем отключается после попытки x.

Проблема:

Мне нужно, чтобы остановить Apache Tomcat после выхода WebAPP, когда соединение с базой данных не имеется.

Возможные решения:

  • Stop Apache Tomcat внутри веб-приложения (уже пробовали отключения порта, который не работал, так как соединение было отказано - с автономным приложением Java он работал)
  • Вызовите внешнее приложение Java из веб-приложения
  • Конфигурируйте Apache Tomcat для выключения, если отключено только веб-приложение - я не смог найти способ сделать это

Любые идеи? Может быть, другой подход?

С уважением

Александр

ответ

1

System.exit(0) из вашего веб-приложения отключит экземпляр Tomcat, если нет настроенного менеджера безопасности.

Работает с автономным сервером, не уверен, работает ли он при работе в качестве службы Windows.

Edit: хотя вы можете прочитать: Calling System.exit() in Servlet's destroy() method

1

При запуске Tomcat, вы, по сути вызывать org.apache.catalina.startup.Bootstrap::main с параметром start. Чтобы остановить Tomcat, вызовите тот же класс/метод командой stop. Для этого вам не нужен другой Java-процесс, просто вызовите метод main статически.

Смотрите Javadoc: http://tomcat.apache.org/tomcat-5.5-doc/catalina/docs/api/org/apache/catalina/startup/Bootstrap.html

Если вы не хотите, зависимость от Tomcat LIBS, просто сделать некоторые отражения магии.

+0

Я думал о том, что уже, но как я могу получить объект Bootstrap, когда я нахожусь в приложении Уэбб? Вне веб-приложения я не знаю, что соединение db не работает. – Dynamicbyte

+0

Как я уже говорил, просто используйте статический основной метод - org.apache.catalina.startup.Bootstrap.main (new String [] {"stop"}) – mindas

+0

Внутри веб-приложения работает не работает! Объект Bootstrap можно вызывать, но генерируется исключение («Соединение отказано»). Я знаю, что он работает из другого Java-процесса, но я хотел избежать необходимости вызова внешнего приложения. – Dynamicbyte

1

ОК, я уверен, что это плохой способ сделать это, но, как и вы, я не смог найти лучшее решение.

try{ 
    MBeanServer server = MBeanUtils.createServer(); 
    ObjectName name = new ObjectName("Catalina:type=Service,serviceName=Catalina"); 
    server.invoke(name, "stop", new Object[0], new String[0]); 
} catch (Exception) { 
    e.printStackTrace(); 
} 

Это в основном скажет Каталине, чтобы убить себя.