Получение имени экземпляра сервера приложений 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.

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

НТН