En ambientes productivos con WebLogic generalmente se tiene un cluster de servidores a fin de lograr un ambiente de Alta Disponibilidad (HA). Esto nos resuelve el problema de no tener un único punto de falla en esa capa, pero nos complica un poco las labores de atención de incidentes.

Lo anterior por cuanto no tenemos certeza de cual de todos los servidores atendió la petición del cliente. O al menos, no de una manera sencilla. En este artículo, les expondré una manera de minimizar este problema.

Obtener el nombre y puerto del servidor.

La idea de mi propuesta es obtener en tiempo de ejecución el nombre del servidor y el puerto en el cual escucha WebLogic. Porqué el puerto además del nombre? Bueno, porque es muy posible que en un mismo servidor tengan varios managed servers y queremos distinguir con precisión cual de ellos es.

Una vez que tenemos ese dato; lo que haremos es colocarlo en algún punto del template de nuestro sistema para que cuando reporten un error, el centro de servicio pueda obtener ese dato y colocarlo como información importante al abrir un ticket.

Paso #1. Nombre del Servidor

Nuestro primer paso es generar un método que tome el nombre del servidor de la propidad del sistema llamada “weblogic.Name”.

  String serverName =  System.getProperty("weblogic.Name");

Paso #2. Usar el MBeanServer

Una vez que tenemos el nombre, debemos usar un MBeanServer para poder obtener datos del WebLogic, en particular el puerto por el cual esta escuchando. Eso se hace de esta manera:

String serverName = "";

 try {
     serverName = System.getProperty("weblogic.Name");

     InitialContext ctx = new InitialContext();

     MBeanServer server = (MBeanServer) ctx.lookup("java:comp/env/jmx/runtime");
     ObjectName objName = new ObjectName("com.bea:Name=" + serverName + ",Type=Server");
     Integer port = (Integer) server.getAttribute(objName, "ListenPort");

     serverName += ":" + port;

 } catch (NamingException | MalformedObjectNameException | MBeanException | AttributeNotFoundException | InstanceNotFoundException | ReflectionException e) {
     System.out.println("Error al tomar serverName " + e.getMessage());
 }
 return serverName;

Es claro que podemos tener muchos más valores del servidor por medio del MBeanServer; pero en este ejemplo tomaremos solo el puerto.

Ya con este método terminado, solo resta exponerlo -a manera de ejemplo- en un ManagedServer de JSF y que se despliegue en un label de nuestro capa de presentación. De esa manera, podemos saber siempre que nodo de un cluster es el que atiende las peticiones de nuestro cliente. Con eso, llegamos a los logs y podemos atender de una manera más expedita los casos de soporte que se aperturen. Esto, en lugar de revisar n servidores en busca de la información que nos interesa.

Autor

Gerardo Arroyo Arce

Chief Technology Officer.

  • Ingeniero en Software. ITCR.
  • Master en Computación en Informática. UCR.
  • Oracle Certified Expert, JEE 6 Web Services Developer.
  • Oracle Certified Professional, Java SE 7 Programmer.
  • Oracle WebLogic Server 12c Certified Implementation Specialist.

Flecha Roja Technologies, 2017.