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)
b. Ir a la pestaña de administración
c. Ir a la sección de “Búsqueda de MBeans"
d. Buscar el recurso deseado (OrdenesCP – Connection Pool)
e. Ir a la pestaña de Operaciones e ingresar al método (refreshConnectionPool)
f. Invocar Método
1.2. Aplicaciones Custom: Java JMX en JDeveloper
a. Ingresar al Jdeveloper y crear la siguiente estructura:
b. En las propiedades del Proyecto (MBeansTest) agregar las siguientes librerias:
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 –> -> 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.
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.
Hola Fernando, gracias por tu comentario, tu blog esta super también. Lo acabo de enlazar.
Saludos
Juan Camilo
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
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.
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/..."
... upss!! se me fué solicitar si alguien tiene idea de cómo solucionarlo?
Gracias.
Publicar un comentario