Desarrollo de un programa cliente de Java Management Extensions utilizando la interfaz de programas de aplicación remota de Java Management Extensions
Puede desarrollar una especificación de conector JMX (Java™ Management Extensions) y una interfaz de programación de aplicación (API) remota JMX (JSR 160). El programa puede comunicarse mediante RMI-IIOP (Remote Method Invocation over Internet Inter-ORB Protocol)
Antes de empezar
Obtenga información sobre JSR 160, API de JMX, y beans gestionados (MBeans). Para obtener más información sobre JSR 160, consulte "JSR 160: Java Management Extensions (JMX) Remote API", en http://www.jcp.org/en/jsr/detail?id=160. Para obtener información acerca de las API de JMX, consulte la documentación de las interfaces de programación de aplicaciones.
Acerca de esta tarea
Puede administrar el entorno de WebSphere Application Server mediante la consola de administración, el programa de utilidad wsadmin o la programación de JMX (Java Management Extensions). Realice esta tarea para desarrollar un programa cliente remoto de JMX utilizando la API remota de JMX para que pueda administrar el entorno mediante la programación de JMX.
Procedimiento
Resultados
Se ha establecido una conexión con el gestor de despliegue a través de una conexión RMI y se ha iniciado el servidor de aplicaciones mediante el MBean del agente de nodo.
Ejemplo
Utilice el siguiente código de cliente ligero de ejemplo para crear y utilizar el cliente JMX.
Algunas sentencias están partidas en varias líneas para fines de impresión.
import java.io.File;
import java.util.Date;
import java.util.Set;
import java.util.Hashtable;
import javax.management.Notification;
import javax.management.NotificationListener;
import javax.management.ObjectName;
import javax.management.MBeanServerConnection;
import javax.management.remote.JMXConnector;
import javax.management.remote.JMXConnectorFactory;
import javax.management.remote.JMXServiceURL;
public class JMXRemoteClientApp implements NotificationListener {
private MBeanServerConnection mbsc = null;
private ObjectName nodeAgent;
private ObjectName jvm;
private long ntfyCount = 0;
private static String userid = null;
private static String pwd = null;
public static void main(String[] args)
{
try {
JMXRemoteClientApp client = new JMXRemoteClientApp();
String host=args[0];
String port=args[1];
String nodeName =args[2];
userid =args[3];
pwd = args[4];
client.connect(host,port);
// Buscar un MBean del agente de nodo
client.getNodeAgentMBean(nodeName);
// Invocar el proceso de inicio.
client.invokeLaunchProcess("server1");
// Registrar los sucesos del agente de nodo
client.registerNotificationListener();
// Ejecutar hasta que se interrumpa.
client.countNotifications();
} catch(Exception e) {
e.printStackTrace();
}
}
private void connect(String host,String port) throws Exception
{
String jndiPath="/WsnAdminNameService#JMXConnector";
JMXServiceURL url =
new JMXServiceURL("service:jmx:iiop://"+host+"/jndi/corbaname:iiop:"+host+":"+port+jndiPath);
Hashtable h = new Hashtable();
//Especificar el ID de usuario y la contraseña para el servidor si la seguridad está habilitada en el servidor.
System.out.println("El ID de usuario es " + userid);
System.out.println("La contraseña es " + pwd);
if ((userid.length() != 0) && (pwd.length() != 0)) {
System.out.println("añadiendo ID de usuario y contraseña a las credenciales...");
String[] credentials = new String[] {userid , pwd };
h.put("jmx.remote.credentials", credentials);
} else {
System.out.println("No se han proporcionado credenciales.");
}
//Establecer la conexión JMX.
JMXConnector jmxc = JMXConnectorFactory.connect(url, h);
//Obtener la instancia de conexión del servidor de MBean.
mbsc = jmxc.getMBeanServerConnection();
System.out.println("Conectado a DeploymentManager");
}
private void getNodeAgentMBean(String nodeName)
{
// Consultar el nombre de objeto de MBean del agente de nodo en el nodo especificado
try {
String query = "WebSphere:type=NodeAgent,node=" + nodeName + ",*";
ObjectName queryName = new ObjectName(query);
Set s = mbsc.queryNames(queryName, null);
if (!s.isEmpty()) {
nodeAgent = (ObjectName)s.iterator().next();
System.out.println("Se ha encontrado el mbean NodeAgent "+ nodeAgent.toString());
} else {
System.out.println("No se ha encontrado el MBean del agente de
nodo");
System.exit(-1);
}
} catch(Exception e) {
System.out.println(e);
System.exit(-1);
}
}
private void invokeLaunchProcess(String serverName)
{
// Use el proceso de inicio en el MBean del agente de nodo para iniciar
// el servidor especificado.
String opName = "launchProcess";
String signature[] = { "java.lang.String" };
String params[] = { serverName };
boolean launched = false;
try {
Boolean b = (Boolean)mbsc.invoke(nodeAgent, opName, params, signature);
launched = b.booleanValue();
if (launched)
System.out.println(serverName + " was launched");
else
System.out.println(serverName + " was not launched");
} catch(Exception e) {
System.out.println("Excepción al invocar launchProcess: " + e);
}
}
private void registerNotificationListener()
{
// Registrar este objeto como un receptor para notificaciones del
// MBean del agente de nodo. No use un filtro ni utilice un objeto
// handback.
try {
mbsc.addNotificationListener(nodeAgent, this, null, null);
System.out.println("Registered for event notifications");
} catch(Exception e) {
System.out.println(e);
}
}
public void handleNotification(Notification ntfyObj, Object handback)
{
// Cada notificación que genera el MBean del agente de nodo provocará que
// se llame a este método.
ntfyCount++;
System.out.println("***************************************************");
System.out.println("* Notification received at " + new Date().toString());
System.out.println("* type = " + ntfyObj.getType());
System.out.println("* message = " + ntfyObj.getMessage());
System.out.println("* source = " + ntfyObj.getSource());
System.out.println(
"* seqNum = " + Long.toString(ntfyObj.getSequenceNumber()));
System.out.println("* timeStamp = " + new Date(ntfyObj.getTimeStamp()));
System.out.println("* userData = " + ntfyObj.getUserData());
System.out.println("***************************************************");
}
private void countNotifications()
{
// Ejecutar hasta que se detenga.
try {
while (true) {
Thread.currentThread().sleep(60000);
System.out.println(ntfyCount + " notification have been received");
}
} catch (InterruptedException e) {
}
}
}