Java Language
JMX
Ricerca…
introduzione
La tecnologia JMX fornisce gli strumenti per la creazione di soluzioni distribuite, basate sul Web, modulari e dinamiche per la gestione e il monitoraggio di dispositivi, applicazioni e reti basate sui servizi. In base alla progettazione, questo standard è adatto per adattare i sistemi legacy, implementare nuove soluzioni di gestione e monitoraggio e collegarsi a quelli del futuro.
Semplice esempio con Platform MBean Server
Diciamo che abbiamo un server che registra i nuovi utenti e li saluta con un messaggio. E vogliamo monitorare questo server e modificare alcuni dei suoi parametri.
Innanzitutto, abbiamo bisogno di un'interfaccia con i nostri metodi di monitoraggio e controllo
public interface UserCounterMBean {
long getSleepTime();
void setSleepTime(long sleepTime);
int getUserCount();
void setUserCount(int userCount);
String getGreetingString();
void setGreetingString(String greetingString);
void stop();
}
E qualche semplice implementazione che ci permetterà di vedere come funziona e come la influenziamo
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) {
}
}
}
}
Per un semplice esempio con gestione locale o remota, dobbiamo registrare il nostro 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();
}
}
Dopodiché possiamo eseguire la nostra applicazione e connetterci tramite jConsole, che può essere trovata nella directory $JAVA_HOME/bin
. Innanzitutto, dobbiamo trovare il nostro processo Java locale con la nostra applicazione
quindi passa alla scheda MBeans e trova l'MBean che abbiamo usato nella nostra classe Main come ObjectName
(nell'esempio sopra è ServerManager
). Nella sezione Attributes
possiamo vedere gli attributi. Se hai specificato solo il metodo get, l'attributo sarà leggibile ma non scrivibile. Se hai specificato entrambi i metodi get e set, l'attributo sarebbe leggibile e scrivibile.
I metodi specificati possono essere richiamati nella sezione Operations
.
Se vuoi essere in grado di utilizzare la gestione remota, avrai bisogno di parametri JVM aggiuntivi, come:
-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
Questi parametri sono disponibili nel Capitolo 2 delle guide JMX . Dopodiché sarai in grado di connetterti alla tua applicazione tramite jConsole in remoto con jconsole host:port
o specificando host:port
o service:jmx:rmi:///jndi/rmi://hostName:portNum/jmxrmi
nella jConsole GUI.
Link utili: