2009-08-31 3 views
3

Есть ли способ отличиться внутри конкретного метода, если он запущен в веб-приложении (например, все приложения развернуты на сфере tomcat/web и т. Д.) Или как отдельное приложение?Как отличить веб-приложение от отдельного приложения?

+1

Что вы хотите, чтобы отличить ДЛЯ? –

+0

Я имею дело с устаревшим кодом, приложение может работать автономно или под tomcat. И есть поток, который запускается во время инициализации приложения. Я могу теперь, когда веб-приложение уже запущено или собирается завершить работу. Я хотел получить картину. Проблема в том, что он не запускает автономный поток, бросая исключение во время запуска/остановки веб-приложения. – blefesd

ответ

2

Ответ «НЕТ». Нет никакого гарантированного способа определить, работает ли ваш код в каком-либо контейнере сервера приложений или контейнере сервлетов или автономно, не полагаясь на внешнюю информацию.

Можно, однако, указать свойство системы в одном случае, а не другой, и проверить его существование:

java -Dstandalone.mode=true MyApplication 

В коде:

if (Boolean.getBoolean("standalone.mode")) { 
    // we're in standalone mode 
} 
0

Ваш вопрос трудно, потому что там не так много, что это «разные» между ними в сторону от того, что он работает. Вы могли бы попытаться вызвать

org.apache.catalina.util.ServerInfo.getServerBuilt() 

И если это не удается, то вам не работают Tomcat. Я не знаком с веб-сферой, но я бы предположил, что попытка вызвать конкретный метод для этого тоже будет работать. Это определенно грязный способ сделать что-то, но это сработает.

1

Вы можете проверить, не обнаружен ли какой-либо экземпляр HttpServlet в текущей трассировке стека. Несмотря на то, что он не является безупречным, он может удовлетворить ваши конкретные потребности.

Примечание: Я не пробовал использовать этот образец кода. Обработка исключений была исключена.

public boolean isWebApplication() { 
    Class<?> httpServletClass; 
    try { 
     httpServletClass = Class.forName("javax.servlet.http.HttpServlet"); 
    } catch (ClassNotFoundException e) { 
     return false; 
    } 

    StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace() 

    for (StackTraceElement element : stackTrace) { 
     Class<?> elementClass = Class.forName(element.getClassName()); 
     if (httpServletClass.isAssignableFrom(elementClass)) { 
      return true; 
     } 
    } 

    return false; 
} 
+2

«Не безупречный» - это преуменьшение. Это будет работать для сервлетов, но не для фильтров/порожденных потоков или, в случае полного контейнера EE, beans. – ChssPly76

+2

В любом случае ваш образец кода потребует, чтобы HttpServlet находился в вашем пути к классам, что вряд ли будет иметь место для бизнес-логики. –

+0

@ ChssPly76: Вот почему я сказал, что «это может удовлетворить ваши конкретные потребности». :) –

1

Предположительно, вы хотите, чтобы проверить это в какой-то «общий» бизнес-логики кода, который не компилируется с любым сервером приложений или API, J2EE на пути к классам, то есть вы не можете получить доступ к HttpServlet напрямую. В этом случае я думаю, что делать Class.forName() для класса J2EE или app-server-sepcific будет вашим лучшим выбором. Если он выбрасывает и исключает, он является автономным, иначе, возможно, вы находитесь на сервере приложений.

0

Я думаю, что самый простой способ - проверить для JNDI system properties (предполагая, что они не устанавливаются в автономном режиме на удаленный сервер - и даже тогда вы должны знать разницу в значениях, таких как сервер не ссылаясь на локальный хост).

Смежные вопросы