Java Language
JMX
Suche…
Einführung
Die JMX-Technologie bietet die Tools zum Erstellen verteilter, webbasierter, modularer und dynamischer Lösungen zum Verwalten und Überwachen von Geräten, Anwendungen und serviceorientierten Netzwerken. Dieser Standard eignet sich prinzipiell für die Anpassung von Altsystemen, die Implementierung neuer Verwaltungs- und Überwachungslösungen und die Einbindung in zukünftige Systeme.
Einfaches Beispiel mit Platform MBean Server
Nehmen wir an, wir haben einen Server, der neue Benutzer registriert und sie mit einer Nachricht begrüßt. Wir möchten diesen Server überwachen und einige seiner Parameter ändern.
Erstens brauchen wir eine Schnittstelle zu unseren Überwachungs- und Kontrollmethoden
public interface UserCounterMBean {
long getSleepTime();
void setSleepTime(long sleepTime);
int getUserCount();
void setUserCount(int userCount);
String getGreetingString();
void setGreetingString(String greetingString);
void stop();
}
Und einige einfache Implementierungen, die uns zeigen lassen, wie es funktioniert und wie wir es beeinflussen
public class UserCounter implements UserCounterMBean, Runnable {
private AtomicLong sleepTime = new AtomicLong(10000);
private AtomicInteger userCount = new AtomicInteger(0);
private AtomicReference<String> greetingString = new AtomicReference<>("welcome");
private AtomicBoolean interrupted = new AtomicBoolean(false);
@Override
public long getSleepTime() {
return sleepTime.get();
}
@Override
public void setSleepTime(long sleepTime) {
this.sleepTime.set(sleepTime);
}
@Override
public int getUserCount() {
return userCount.get();
}
@Override
public void setUserCount(int userCount) {
this.userCount.set(userCount);
}
@Override
public String getGreetingString() {
return greetingString.get();
}
@Override
public void setGreetingString(String greetingString) {
this.greetingString.set(greetingString);
}
@Override
public void stop() {
this.interrupted.set(true);
}
@Override
public void run() {
while (!interrupted.get()) {
try {
System.out.printf("User %d, %s%n", userCount.incrementAndGet(), greetingString.get());
Thread.sleep(sleepTime.get());
} catch (InterruptedException ignored) {
}
}
}
}
Für ein einfaches Beispiel mit lokaler oder Remote-Verwaltung müssen wir unser MBean registrieren:
import javax.management.InstanceAlreadyExistsException;
import javax.management.MBeanRegistrationException;
import javax.management.MBeanServer;
import javax.management.MalformedObjectNameException;
import javax.management.NotCompliantMBeanException;
import javax.management.ObjectName;
import java.lang.management.ManagementFactory;
public class Main {
public static void main(String[] args) throws MalformedObjectNameException, NotCompliantMBeanException, InstanceAlreadyExistsException, MBeanRegistrationException, InterruptedException {
final UserCounter userCounter = new UserCounter();
final MBeanServer mBeanServer = ManagementFactory.getPlatformMBeanServer();
final ObjectName objectName = new ObjectName("ServerManager:type=UserCounter");
mBeanServer.registerMBean(userCounter, objectName);
final Thread thread = new Thread(userCounter);
thread.start();
thread.join();
}
}
Danach können wir unsere Anwendung ausführen und über jConsole eine Verbindung herstellen, die sich in Ihrem $JAVA_HOME/bin
. Zuerst müssen wir mit unserer Anwendung unseren lokalen Java-Prozess finden
Wechseln Sie dann zur Registerkarte MBeans und suchen Sie die MBean, die wir in unserer Main-Klasse als ObjectName
(im obigen Beispiel ist es ServerManager
). Im Abschnitt " Attributes
" können wir Attribute erkennen. Wenn Sie nur die Get-Methode angegeben haben, ist das Attribut lesbar, aber nicht schreibbar. Wenn Sie sowohl get- als auch set-Methoden angegeben haben, wäre das Attribut lesbar und schreibbar.
Bestimmte Methoden können im Operations
Abschnitt aufgerufen werden.
Wenn Sie die Remote-Verwaltung verwenden möchten, benötigen Sie zusätzliche JVM-Parameter wie:
-Dcom.sun.management.jmxremote=true //true by default
-Dcom.sun.management.jmxremote.port=36006
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
Diese Parameter finden Sie in Kapitel 2 der JMX-Handbücher . Danach können Sie über jConsole über jConsole remote mit jconsole host:port
oder mit Angabe von host:port
oder service:jmx:rmi:///jndi/rmi://hostName:portNum/jmxrmi
in der jConsole-GUI verbinden.
Nützliche Links: