Refresh de Pooling de Conexiones Remoto a través de MBeans.
6
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