Java Language
JMX
Sök…
Introduktion
JMX-tekniken ger verktyg för att bygga distribuerade, webbaserade, modulära och dynamiska lösningar för hantering och övervakning av enheter, applikationer och servicedrivna nätverk. Genom design är denna standard lämplig för anpassning av gamla system, implementering av nya hanterings- och övervakningslösningar och anslutning till framtidens.
Enkelt exempel med plattform MBean Server
Låt oss säga att vi har en server som registrerar nya användare och hälsar dem med något meddelande. Och vi vill övervaka denna server och ändra några av dess parametrar.
Först behöver vi ett gränssnitt med våra övervaknings- och kontrollmetoder
public interface UserCounterMBean {
long getSleepTime();
void setSleepTime(long sleepTime);
int getUserCount();
void setUserCount(int userCount);
String getGreetingString();
void setGreetingString(String greetingString);
void stop();
}
Och en enkel implementering som låter oss se hur det fungerar och hur vi påverkar det
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 ett enkelt exempel med lokal eller fjärrhantering måste vi registrera vår MBean:
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();
}
}
Efter det kan vi köra vår applikation och ansluta till den via jConsole, som finns i din $JAVA_HOME/bin
katalog. Först måste vi hitta vår lokala java-process med vår ansökan
växla sedan till fliken MBeans och hitta den MBean som vi använde i vår huvudklass som ett ObjectName
(i exemplet ovan är det ServerManager
). I avsnittet Attributes
vi se attribut. Om du bara angav get-metod är attribut läsbart men inte skrivbart. Om du specificerade både get och set-metoder skulle attribut vara läsbart och skrivbart.
Specificerade metoder kan åberopas i avsnittet Operations
.
Om du vill kunna använda fjärrhantering behöver du ytterligare JVM-parametrar, till exempel:
-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
Dessa parametrar finns i kapitel 2 i JMX-guider . Efter det kommer du att kunna ansluta till din applikation via jConsole på distans med jconsole host:port
eller med att ange host:port
eller service:jmx:rmi:///jndi/rmi://hostName:portNum/jmxrmi
i jConsole GUI.
Användbara länkar: