Java Language
JMX
Zoeken…
Invoering
De JMX-technologie biedt de tools voor het bouwen van gedistribueerde, webgebaseerde, modulaire en dynamische oplossingen voor het beheren en bewaken van apparaten, applicaties en servicegedreven netwerken. Door het ontwerp is deze standaard geschikt voor het aanpassen van oudere systemen, het implementeren van nieuwe beheer- en monitoringoplossingen en het aansluiten op die van de toekomst.
Eenvoudig voorbeeld met Platform MBean Server
Stel dat we een server hebben die nieuwe gebruikers registreert en begroet met een bericht. En we willen deze server controleren en enkele van zijn parameters wijzigen.
Ten eerste hebben we een interface nodig met onze monitoring- en controlemethoden
public interface UserCounterMBean {
long getSleepTime();
void setSleepTime(long sleepTime);
int getUserCount();
void setUserCount(int userCount);
String getGreetingString();
void setGreetingString(String greetingString);
void stop();
}
En een eenvoudige implementatie die ons laat zien hoe het werkt en hoe we het beïnvloeden
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) {
}
}
}
}
Voor een eenvoudig voorbeeld met lokaal of extern beheer moeten we onze MBean registreren:
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();
}
}
Daarna kunnen we onze toepassing uitvoeren en er verbinding mee maken via jConsole, die u kunt vinden in uw map $JAVA_HOME/bin
. Eerst moeten we ons lokale Java-proces vinden met onze applicatie
schakel dan over naar het tabblad MBeans en vind de MBean die we in onze hoofdklasse als ObjectName
(in het voorbeeld hierboven is dat ServerManager
). In het gedeelte Attributes
kunnen we kenmerken bekijken. Als u alleen de methode get hebt opgegeven, is het kenmerk leesbaar maar niet beschrijfbaar. Als u zowel get- als set-methoden opgeeft, zou het kenmerk leesbaar en beschrijfbaar zijn.
Opgegeven methoden kunnen worden opgeroepen in het gedeelte Operations
.
Als u extern beheer wilt kunnen gebruiken, hebt u aanvullende JVM-parameters nodig, zoals:
-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
Deze parameters zijn te vinden in hoofdstuk 2 van JMX-handleidingen . Daarna kunt u op afstand verbinding maken met uw toepassing via jConsole met jconsole host:port
of met het opgeven van host:port
of service:jmx:rmi:///jndi/rmi://hostName:portNum/jmxrmi
in jConsole GUI.
Handige links: