Получение имени экземпляра сервера приложений WebSphere
Моя веб-служба будет запущена на сервере приложений Jboss или на сервере приложений Websphere. Для обоих из них мне нужно знать имя экземпляра, для Jboss я могу использовать System.getProperty("jboss.server.name"),
, но что я могу использовать для WebSphere? Я не могу использовать специфичные для WebSphere методы, мне нужно вызвать System.properties
Спасибо
Ответы
Ответ 1
Чтобы поддерживать нейтральную платформу, вы можете установить переменную как аргумент JVM для сервера Websphere (по одному для каждого node, если его кластеризовать). Для Websphere 7 в консоли администратора вы найдете следующее:
Servers > Server Types > Websphere application servers > [your cluster node] >
> Java and Process Management > Process Definition > Java Virtual Machine >
> Generic JVM arguments
и добавьте такую переменную...
-DServerName=serverNodeA
Затем вы можете получить доступ к значению в своем коде как...
String serverName = System.getproperty("ServerName");
Этот метод может использоваться со всеми серверами приложений, если у вас есть доступ к добавлению аргументов в JVM. Я уверен, что для запроса имени node должен быть специфический API Websphere, но затем вы вводите свой код на сервер, что затрудняет unit test и не переносится. Я предпочитаю этот подход.
Ответ 2
Альтернативой, по крайней мере для WebSphere, является поиск в дереве JNDI.
Это то, что я использую:
InitialContext ic = new javax.naming.InitialContext();
String serverName = ic.lookup("servername").toString();
Таким образом, мне не нужно ничего настраивать, поскольку WebSphere связывает эту информацию для меня.
Имя ячейки и node также можно получить, используя "thisNode/cell/cellname" и "thisNode/nodename". Что-то полезное в кластерах.
Ответ 3
Я соглашаюсь с указанием имени сервера как переменной среды (Manglu touch также прекрасен). Чтобы завершить обсуждение, вот как получить имя экземпляра экземпляра через runtime (этот API устарел в последних версиях, но все еще используется);
import com.ibm.websphere.runtime.ServerName;
System.out.println("Display name: " + ServerName.getDisplayName());
System.out.println("Full name: " + ServerName.getFullName());
Пример вывода будет выглядеть как
Отображаемое имя: server1
Полное имя: was7host01Node01Cell\was7host01Node01\server1
Ответ 4
Решение kurtcebe работает хорошо. Для тех, кто использует maven, вы не сможете легко получить банку в свой проект. Из-за этого используйте Class.forname...
try {
Class<?> c = Class.forName("com.ibm.websphere.runtime.ServerName");
LOGGER.debug("Class found" + c);
Method m = c.getMethod("getFullName", new Class<?>[0]);
LOGGER.debug("Method found" + m);
Object o = m.invoke(DeliveryServiceUtils.class, new Object[0]);
LOGGER.debug("Method invoked, response is " + o);
processName = o.toString();
}
catch (Exception ex) {
processName = "unknown - " + ex.getClass().getName() + ": " + ex.getMessage();
}
Ответ 5
Подход, предложенный Брэдом, хорош, но я бы сделал это тонко по-другому.
В пользовательском свойстве Server JVM я бы добавил свойство Server-Name и задал его значение как WAS_SERVER_NAME.
вот хлебная крошка для этого:
Серверы → - > Определение процесса → Виртуальная машина Java > Пользовательские свойства
Добавьте новый, который будет иметь имя ServerName со значением ${WAS_SERVER_NAME}
У каждого экземпляра сервера WAS эта переменная WebSphere Variable устанавливается на имя экземпляра сервера. Вам не нужно беспокоиться о том, как создавать опечатки (или подобные ошибки здесь), и этот подход работает на всех серверах WAS.
Вы можете создать Сервер с такими значениями, которые будут установлены как шаблон, и когда вы создадите новый сервер, они всегда присутствуют для вас.
НТН