# Java Management Extensions

Java Management Extensions (JMX) è una tecnologia Java che fornisce strumenti per la gestione e il monitoraggio di applicazioni, oggetti di sistema, dispositivi (come le stampanti) e reti orientate ai servizi. Tali risorse sono rappresentate da oggetti chiamati Managed Bean (o MBean). Nell'API, le classi possono essere caricate e istanziate dinamicamente. La gestione e il monitoraggio delle applicazioni possono essere progettate e sviluppate utilizzando il Java Dynamic Management Kit.
La JSR 003 del Java Community Process definì JMX 1.0, 1.1 e 1.2. JMX 2.0 è stato sviluppato sotto la JSR 255, ma questa JSR è stata successivamente ritirata. La JMX Remote API 1.0 per la gestione e il monitoraggio remoto è specificata dalla JSR 160. Inoltre, con la JSR 262 era stata sviluppata un'estensione della JMX Remote API per i Web Services.
Adottata inizialmente dalla comunità J2EE, JMX è parte integrante di J2SE a partire dalla versione 5.0. "JMX" è un marchio di Oracle Corporation.

## Architettura

JMX utilizza un'architettura a tre livelli:
* Il livello Probe, chiamato anche Instrumentation. Contiene le sonde (chiamate MBean) che strumentano le risorse.
* Il livello Agent, o MBeanServer. È il cuore di JMX e funge da intermediario tra un MBean e le applicazioni.
* Il livello Remote Management. Consente alle applicazioni remote di accedere ad un MBeanServer attraverso connettori e adattatori. Un connettore fornisce l'accesso remoto completo all'API di un MBeanServer utilizzando varie comunicazioni (RMI, IIOP, JMS, WS- *, ecc.), mentre un adattatore adatta l'API ad un altro protocollo (come SNMP) o alla GUI basata sul Web (HTML/HTTP, WML/HTTP, ecc.).
Le applicazioni possono essere console generiche o applicazioni specifiche del dominio. Le applicazioni esterne possono interagire con gli MBean tramite l'uso di connettori JMX e adattatori di protocollo. I connettori servono per connettere un agente con un'applicazione di gestione remota abilitata per JMX. Questa forma di comunicazione coinvolge un connettore nell'agente JMX e un client connettore nell'applicazione di gestione.
Gli adattatori di protocollo forniscono una vista di gestione dell'agente JMX attraverso un determinato protocollo. Le applicazioni di gestione che si connettono a un adattatore di protocollo sono in genere specifiche per il protocollo specificato.

## Managed Bean

Un Managed Bean, a volte indicato semplicemente come MBean, è un tipo di JavaBean creato con un dependency injection. I Managed Bean sono particolarmente utilizzati nella tecnologia Java Management Extensions, ma con Java EE 6 la specifica prevede un significato più dettagliato di Managed Bean.
Un MBean rappresenta una risorsa in esecuzione nella Java Virtual Machine, ad esempio un'applicazione o un servizio tecnico Java EE (monitor transazionale, driver JDBC, ecc.). Essi possono essere utilizzati per: raccogliere statistiche su problemi come prestazioni, utilizzo delle risorse o problemi (pull); ottenere e impostare le configurazioni o le proprietà dell'applicazione (push/pull); notificare eventi come guasti o cambiamenti di stato (push).
Java EE 6 prevede che un Managed Bean sia un bean implementato da una classe Java, denominata classe bean. Una classe Java di primo livello è un Managed Bean se è definito come tale da qualsiasi altra specifica della tecnologia Java EE (ad esempio, la specifica della tecnologia JavaServer Faces) o se soddisfa tutte le seguenti condizioni:
* Non è una classe interna non statica.
* È una classe concreta o è annotato con @Decorator .
* Non è annotato con un'annotazione di definizione del componente EJB o dichiarato come classe bean EJB in ejb-jar.xml.
Non è richiesta alcuna dichiarazione speciale (come un'annotazione) per definire un Managed Bean.
Un MBean può notificare ad un MBeanServer le sue modifiche interne (per gli attributi) implementando javax.management.NotificationEmitter . L'applicazione interessata alle modifiche di un MBean registra un listener (javax.management.NotificationListener) verso un MBeanServer. Si noti che JMX non garantisce che i listener riceveranno tutte le notifiche.

### Tipi

Esistono due tipi di base di MBean:
* MBean standard: implementano un'interfaccia business contenente setter e getter per gli attributi e le operazioni (cioè i metodi).
* MBean dinamici: implementano l'interfaccia javax.management.DynamicMBean, che fornisce una maniera per elencare gli attributi e le operazioni e per prelevare ed impostare i valori degli attributi.
Altri tipi sono: Open MBean, Model MBean e Monitor MBean. Gli Open MBean sono MBean dinamici che si basano sui tipi di dati di base; sono autoesplicativi e più facili da usare. I Model MBean sono MBean dinamici che possono essere configurati durante il runtime. Viene inoltre fornita una classe MBean generica per configurare dinamicamente le risorse durante il runtime del programma.
Un MXBean (o Platform MBean) è un tipo speciale di MBean che reifica i sottosistemi della Java Virtual Machine, come ad esempio il garbage collection, la compilazione JIT, i pool di memoria, il multi-threading, ecc.
Un MLet (o Management applet) è un MBean di utilità per caricare, istanziare e registrare gli MBean in un MBeanServer da una descrizione XML. Il formato del descrittore XML è il seguente: