En JPA 2 se da soporte para el bloqueo optimista y pesimista (optimistic/pessimistic locking). En este artículo haremos un ejemplo de como lograr el bloqueo optimista usando JPA en un aplicativo JEE.

Bloqueo en JPA

El bloque es esencial para evitar colisiones al momento de hacer un update resultado de actualizaciones simultáneas de los mismos datos por dos o más usuarios concurrentes.

El Bloqueo Optimista es aplicado al momento de hacer un commit a una transacción. Todo objeto que ha sido modificado o borrado es validado. Una excepción sería arrojada si se determina que el update esta siendo realizado sobre una versión vieja del objeto en la base de datos; es decir, que en otra transacción ha sido actualizado y comprometido.

El bloqueo optimista debería ser la primera elección para la mayoria de las aplicaciones, esto por cuanto en contraposición con el bloqueo pesimista, resulta más sencilla y eficiente de usar.

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, .