Ein JMX-Clientprogramm über die JMX-Remote-API entwickeln
Dieser Artikel beschreibt, wie Sie eine JMX-Connector-Spezifikation (Java™ Management Extensions) und eine JMX-Remote-API (JSR 160) entwickeln. Das Programm kann über Remote Method Invocation over Internet Inter-ORB Protocol (RMI-IIOP) kommunizieren.
Vorbereitende Schritte
Dieser Artikel setzt ein grundlegendes Verständnis von JSR 160, JMX-APIs und verwalteten Beans (MBeans, Managed Beans) voraus. Weitere Informationen zu JSR 160 finden Sie in der Spezifikation "JSR 160: Java Management Extensions (JMX) Remote API" auf der Website "http://www.jcp.org/en/jsr/detail?id=160". Weitere Informationen zu den JMX-APIs und zu MBeans finden Sie in der Dokumentation zu den Anwendungsprogrammierschnittstellen.
Informationen zu diesem Vorgang
Sie können Ihre Umgebung von WebSphere Application Server mit der Administrationskonsole, dem Dienstprogramm wsadmin und über JMX-Programmierung (Java Management Extensions) verwalten. Führen Sie diese Task aus, um ein fernes JMX-Clientprogramm mit der JMX Remote API zu entwickeln, sodass Sie Ihre Umgebung mit JMX-Programmierung verwalten können.
Vorgehensweise
Ergebnisse
Sie haben eine Verbindung zum Deployment Manager über eine RMI-Verbindung aufgebaut und den Anwendungsserver über die Node-Agent-MBean gestartet.
Beispiel
Verwenden Sie das folgende Thin-Client-Codebeispiel, um den JMX-Client zu erstellen und zu verwenden.
Einige Anweisungen sind zur besseren Lesbarkeit auf mehrere Zeilen verteilt.
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);
// MBean für Node Agent suchen
client.getNodeAgentMBean(nodeName);
// Startprozess aufrufen
client.invokeLaunchProcess("server1");
// Node-Agent-Ereignisse registrieren
client.registerNotificationListener();
// Ausführen bis Unterbrechung
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();
// Benutzer-ID und Kennwort für den Server angeben, wenn die Sicherheit im Server aktiviert ist
System.out.println("Userid is " + userid);
System.out.println("Password is " + pwd);
if ((userid.length() != 0) && (pwd.length() != 0)) {
System.out.println("adding userid and password to credentials...");
String[] credentials = new String[] {userid , pwd };
h.put("jmx.remote.credentials", credentials);
} else {
System.out.println("No credentials provided.");
}
// JMX-Verbindung herstellen.
JMXConnector jmxc = JMXConnectorFactory.connect(url, h);
// Instanz der MBean-Serververbindung abrufen.
mbsc = jmxc.getMBeanServerConnection();
System.out.println("Connected to DeploymentManager");
}
private void getNodeAgentMBean(String nodeName)
{
// Objektnamen der Node-Agent-MBean auf dem angegebenen Knoten abrufen
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("NodeAgent mbean found "+ nodeAgent.toString());
} else {
System.out.println("Node agent MBean was not found");
System.exit(-1);
}
} catch (Exception e) {
System.out.println(e);
System.exit(-1);
}
}
private void invokeLaunchProcess(String serverName)
{
// Startprozess in der Node-Agent-MBean zum Starten des angegebenen
// Servers verwenden
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("Ausnahme beim Aufrufen von launchProcess: " + e);
}
}
private void registerNotificationListener()
{
// Dieses Objekt als Listener für Benachrichtigungen der
// NodeAgent-MBean registrieren. Keinen Filter und kein
// Handback-Objekt verwenden.
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)
{
// Jede Benachrichtigung, die die Node-Agent-MBean generiert, bewirkt
// einen Aufruf dieser Methode.
ntfyCount++;
System.out.println("***************************************************");
System.out.println("* Benachrichtigung empfangen am " + 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()
{
// Ausführen bis Stopp
try {
while (true) {
Thread.currentThread().sleep(60000);
System.out.println(ntfyCount + " notification have been received");
}
} catch (InterruptedException e) {
}
}
}