2012-05-16 13 views
10

Mi servicio web se ejecutará en un Servidor de aplicaciones Jboss o en un Servidor de aplicaciones Websphere. Para ambos, necesito saber el nombre de la instancia, para Jboss puedo usar System.getProperty("jboss.server.name"),, pero ¿qué puedo usar para WebSphere? No puedo utilizar los métodos de WebSphere específicos, necesito llamar System.propertiesObtención del nombre de instancia de una aplicación WebSphere Servidor

Gracias

Respuesta

7

Para mantenerlo plataforma neutral puede definir una variable como un argumento de JVM para el servidor Websphere (uno para cada nodo si está agrupado). Para WebSphere 7, se encuentra el siguiente en la consola de administración ...

Servers > Server Types > Websphere application servers > [your cluster node] > 
    > Java and Process Management > Process Definition > Java Virtual Machine > 
    > Generic JVM arguments 

y añadir una variable como esta ...

-DServerName=serverNodeA 

A continuación, puede acceder al valor en su código como. ..

String serverName = System.getproperty("ServerName"); 

Esta técnica se puede usar con todos los servidores de aplicaciones siempre que tenga acceso para agregar argumentos a la JVM. Estoy seguro de que debe haber una API específica de Websphere para consultar el nombre del nodo, pero luego está escribiendo su código en el servidor, lo que dificulta la prueba unitaria y no es portátil. Yo prefiero este enfoque.

3

El enfoque sugerido por Brad es bueno, pero lo haría sutilmente diferente.

En la propiedad personalizada de Server JVM, agregaría un Nombre de servidor de propiedad y especificaría su valor como WAS_SERVER_NAME.

aquí es la miga de pan para esto:

Servidores -> -> Definición de proceso -> Java Virtual Machine> Propiedades personalizadas

Añadir una nueva Wiht decir ServerName por valor de $ {WAS_SERVER_NAME}

Cada instancia de servidor WAS tiene esta variable de WebSphere establecida en el nombre de la instancia del servidor. No necesita preocuparse por realizar errores tipográficos (o errores similares aquí) y este enfoque funciona para todos los Servidores WAS.

Puede crear un servidor con tales valores establecidos como una plantilla y cuando crea un nuevo servidor, estos siempre están presentes para usted.

HTH

9

Estoy de acuerdo con la especificación de nombre del servidor como una variable de entorno (el toque de Manglu también está muy bien). Para completar la discusión, veamos cómo obtener el nombre de la instancia a través del tiempo de ejecución (esta API está en desuso en las versiones recientes, pero todavía está en uso);

import com.ibm.websphere.runtime.ServerName; 

System.out.println("Display name: " + ServerName.getDisplayName()); 
System.out.println("Full name: " + ServerName.getFullName()); 

Salida de ejemplo sería como

de nombres: server1
Nombre completo: was7host01Node01Cell \ was7host01Node01 \ server1

+0

Probé la solución y funciona bien. – Stony

+0

Exactamente lo que necesitaba. Funciona de maravilla. –

6

solución kurtcebe funciona bien. Para aquellos que usan maven, no podrán obtener el jar fácilmente en su proyecto. Debido a esto, use 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(); 
} 
13

Una alternativa, al menos para WebSphere, es buscarla en el árbol JNDI. Esto es lo que yo uso:

InitialContext ic = new javax.naming.InitialContext(); 
String serverName = ic.lookup("servername").toString(); 

De esta manera no tengo que configurar nada, WebSphere une esa información para mí.

El nombre de celda y nodo también se puede recuperar usando "thisNode/cell/cellname" y "thisNode/nodename". Algo útil en clusters.

+0

¡También funciona para mí! – Stony

+0

Estupendo, no olvides votar :) – IsidroGH

+0

Esto me ahorró muchos dolores de cabeza ya que no quería enviar un parámetro JVM para cada aplicación web. +1 –

Cuestiones relacionadas