Refresh de Pooling de Conexiones Remoto a través de MBeans.

Este es una aportación de Andrés Ramírez de Perú. El tuvo un issue de refresh de Pooling de Conexiones hacia BD, sobre todo al modificar el cuerpo de un paquete almacenado. El decidió realizarlo a través de Mbeans controlando el pool de conexiones. Aquí la descripción de cómo lo hizo (gracias Andrés):

1. UTILIZACION de Mbeans

1.1. Mediante la consola de administración: Oracle Enterprise Manager

a. Ingresar a la instancia deseada (oc4j_soa)

clip_image003

b. Ir a la pestaña de administración

clip_image006

c. Ir a la sección de “Búsqueda de MBeans"

clip_image009

d. Buscar el recurso deseado (OrdenesCP – Connection Pool)

clip_image012

e. Ir a la pestaña de Operaciones e ingresar al método (refreshConnectionPool)

clip_image016

f. Invocar Método

clip_image019


1.2. Aplicaciones Custom: Java JMX en JDeveloper

a. Ingresar al Jdeveloper y crear la siguiente estructura:

clip_image021

b. En las propiedades del Proyecto (MBeansTest) agregar las siguientes librerias:

clip_image023

Ubicaciones de los Jars:

C:\Jdeveloper\j2ee\home\lib\jmx_remote_api.jar

C:\Jdeveloper\j2ee\home\lib\jmxcluster.jar

C:\Jdeveloper\j2ee\home\lib\jmxri.jar

C:\Jdeveloper\j2ee\home\oc4jclient.jar

C:\Jdeveloper\opmn\lib\ons.jar

C:\Jdeveloper\opmn\lib\optic.jar

C:\Jdeveloper\j2ee\home\lib\adminclient.jar

Nota: Agregar la Libreria J2EE desde la opción: Add Library...

c. Definir la clase MBeansClient.java (Ver Anexo 1)

ANEXO 1

package mbeanstest;

import java.io.IOException;

import java.net.MalformedURLException;

import java.util.Hashtable;

import java.util.Iterator;

import java.util.Set;

import javax.management.AttributeNotFoundException;

import javax.management.InstanceNotFoundException;

import javax.management.InvalidAttributeValueException;

import javax.management.MBeanException;

import javax.management.MBeanServerConnection;

import javax.management.MalformedObjectNameException;

import javax.management.ObjectName;

import javax.management.ReflectionException;

import javax.management.remote.JMXConnector;

import javax.management.remote.JMXConnectorFactory;

import javax.management.remote.JMXServiceURL;

import oracle.oc4j.admin.jmx.remote.api.JMXConnectorConstant;

public class MBeansClient {

//URL del OC4J Single

private static final String OC4J_SOA_URL =

"service:jmx:rmi:///opmn://172.20.1.92:6005/oc4j_soa";

//URL del OC4J Cluster

private static final String CLUSTER_OC4J_SOA_URL =

"service:jmx:rmi:///opmn://172.20.1.92:6005/cluster";

//Nombre del recurso MBean

private static final String MBEAN_OBJECT_NAME =

"oc4j:j2eeType=JDBCResource,name=\"OrdenesCP\",J2EEApplication=default,J2EEServer=standalone";

//Nombre del grupo (cluster) MBean

private static final String CLUSTER_MBEAN_OBJECT_NAME =

"ias:j2eeType=J2EEServer,name=oc4j_soa,J2EEServerGroup=default_group,ASInstance=soa.test.com";

//Nombre del método del MBean

private static final String MBEAN_METHOD_NAME =

"refreshConnectionPool";

//Credenciales del Administrador

private static final String USERNAME = "oc4jadmin";

private static final String PASSWORD = "oracle10g";

public MBeansClient() {

}

//Crear conexion con el Servidor MBeans

public MBeanServerConnection getMBeanConnection(String URL) throws MalformedURLException,

IOException {

JMXConnector jmxConnector = null;

JMXServiceURL serviceUrl = new JMXServiceURL(URL);

Hashtable env = new Hashtable();

env.put(JMXConnectorFactory.PROTOCOL_PROVIDER_PACKAGES, "oracle.oc4j.admin.jmx.remote");

Hashtable credentials = new Hashtable();

credentials.put(JMXConnectorConstant.CREDENTIALS_LOGIN_KEY, USERNAME);

credentials.put(JMXConnectorConstant.CREDENTIALS_PASSWORD_KEY, PASSWORD);

env.put(JMXConnector.CREDENTIALS, credentials);

jmxConnector = JMXConnectorFactory.newJMXConnector(serviceUrl, env);

jmxConnector.connect();

MBeanServerConnection mBeanServerConnection = jmxConnector.getMBeanServerConnection();

return mBeanServerConnection;

}

//Método que muestra todos los MBeans disponibles

public void printAllMBeans(MBeanServerConnection mBeanServerConnection) throws IOException {

System.out.println(" \n\n Imprimiendo todos los MBean ");

Set mbeans = mBeanServerConnection.queryNames(null, null);

Iterator iter = mbeans.iterator();

while (iter.hasNext()) {

System.out.println(iter.next().toString());

ObjectName objectName = (ObjectName)iter.next();

System.out.println(" domain " + objectName.getDomain() + " " + objectName.getKeyPropertyListString());

}

System.out.println(" Fin de impresion \n\n ");

}

//Método que invoca a la operación "refreshConnectionPool" perteneciente al recurso "OrdenesCP" en una sola instancia OC4J

private void testSingle() throws MalformedURLException, IOException,

MalformedObjectNameException,

InstanceNotFoundException, MBeanException,

ReflectionException,

AttributeNotFoundException,

InvalidAttributeValueException {

MBeanServerConnection mBeanServerConnection = getMBeanConnection(OC4J_SOA_URL);

//printAllMBeans(mBeanServerConnection);

ObjectName objectName = new ObjectName(MBEAN_OBJECT_NAME);

System.out.println("\n\n Invoke Method over single oc4j ............");

Object invokeMethodReturnObject =

mBeanServerConnection.invoke(objectName, MBEAN_METHOD_NAME, null,

null);

//El retorno será = null pues la operacion es de tipo void

System.out.println(" Single invokeMethodReturnObject " +

invokeMethodReturnObject);

}

//Método que invoca a la operación "refreshConnectionPool" perteneciente al recurso "OrdenesCP" en un grupo (cluster) OC4J

public void testCluster() throws MalformedURLException, IOException,

MalformedObjectNameException,

InstanceNotFoundException, MBeanException,

ReflectionException,

AttributeNotFoundException,

InvalidAttributeValueException {

MBeanServerConnection mBeanServerConnection = getMBeanConnection(CLUSTER_OC4J_SOA_URL);

//printAllMBeans(mBeanServerConnection);

ObjectName clusterObjectName = new ObjectName(CLUSTER_MBEAN_OBJECT_NAME);

ObjectName customObjectName = new ObjectName(MBEAN_OBJECT_NAME);

Object[] invokeMethodParameters =

new Object[] { customObjectName, MBEAN_METHOD_NAME, null, null };

String[] invokeMethodSignature =

new String[] { "javax.management.ObjectName", "java.lang.String", "[Ljava.lang.Object;", "[Ljava.lang.String;" };

System.out.println("\n\n Invoke Method over cluster oc4j ............");

Object invokeMethodResult =

mBeanServerConnection.invoke(clusterObjectName, "invoke", invokeMethodParameters, invokeMethodSignature);

//El retorno será = null pues la operacion es de tipo void

System.out.println(" Cluster invokeMethodResult object is " + invokeMethodResult);

}

public static void main(String[] args) throws MalformedURLException,

IOException,

MalformedObjectNameException,

InstanceNotFoundException,

MBeanException,

ReflectionException,

AttributeNotFoundException,

InvalidAttributeValueException {

MBeansClient mBeanClient = new MBeansClient();

mBeanClient.testSingle();

mBeanClient.testCluster();

}

}

Especificaciones:

1.Modificar el IP del servidor y el puerto “Request” del opmn según corresponda. De igual modo, especificar el nombre correcto del OC4J correspondiente a la instalación del SOA Suite.

2. Modificar el IP del servidor y el puerto “Request” del opmn según corresponda.

3. El nombre correcto del MBean puede ser encontrado de la siguiente manera:

Ir al EM console –> oc4j_soa –>Administration –> System MBean Browser –> Cluster MBean Browser –> Operations –> getAttribute –> clip_image033 -> Buscar el recurso deseado

4. El nombre correcto del Cluster MBean puede ser encontrado de la siguiente manera:

Ir al em console –> oc4j_soa –> Administration –> System MBean Browser à Cluster MBean Browser -> Copiar el MBean Name

5. Especificar las credenciales apropiadas


6 Responses to Refresh de Pooling de Conexiones Remoto a través de MBeans.

Anónimo dijo...

Estimados,

Felicitaciones por su espacio.

Tengo un blog dedicado exclusivamente a Oracle RAC. Quisiera intercambiar links con ustedes. Pueden contactarme en oracleracnotes@gmail.com
Pueden visitar el blog en http://oracleracnotes.wordpress.com

Saludos,
Fernando.

Juan Camilo Ruiz dijo...

Hola Fernando, gracias por tu comentario, tu blog esta super también. Lo acabo de enlazar.

Saludos

Juan Camilo

Anónimo dijo...

Estaa chevere tu post, pero tengo un par de dudas q tal vez tu con tus conocimientos puedas solventar, si yo tengo un WS publicado y lo que busco es administrarlo a traves de JMX como lo podria hacer desde una app que apenas estoy construyendo. si quieress escribeme plz!! toy deseperado abdito_8@hotmail.com

Anónimo dijo...

hola tengo el siguiente problema: he usado el jdeveloper para hacer una aplicacion web con java y servlets, cunao lo corro en el jdeveloper me corre a la perfeccion, el problema es cuando lo subo al oas, al momento de generar mi war, no lee ninguno de los servlets me aparece un mensaje como que la pagina no existe. alguan comentari al respecto?
gracias por la ayuda de antemano.

Iran Vasquez dijo...

Hola,
He implementado el ejemplo en un EJB para la detención de un MDB ubicado dentro de la misma instancia, y funciona bien, pero necesito que se detenga también en los otros 2 nodos del cluster.
Hice la implementación utilizando "service:jmx:rmi:///opmn://host1.mycompay.com:6003/cluster/soa1013.host1.mycompay.com/OC4J_XCONTAINER", sin embargo sólo detiene el MDB del nodo actual.
He pensado en hacer la invocación nodo a nodo, sin embargo cero que debe haber una solución más eficiente, sino no tendría sentido usar la uri " ..:6003/cluster/..."

Iran Vasquez dijo...

... upss!! se me fué solicitar si alguien tiene idea de cómo solucionarlo?
Gracias.