Java Managenent Extension JMX Aplikační programování v Javě (BI-APJ) - 14 Ing. Jiří Daněček Katedra softwarového inženýrství Fakulta informačních technologií ČVUT Praha Evropský sociální fond Praha & EU: Investujeme do vaší budoucnosti
Přehled JMX The Java Management Extensions (JMX) - standardní způsob správy (tj. sledování a ovládání) zdrojů tj. např. aplikací, zařízení, služeb atd. JMX definuje: architekturu, návrhové vzory, API, služby. Zdroje jsou sledované (instrumented) jedním nebo více Java objekty tzv. Managed Beany (MBeans). MBeany jsou registrovány u speciálního objektu zvaného MBean server. Ten spolu se službami pro správu MBean tvoří tzv JMX agenta. Pozn.: Nezaměnit s Managed Beans v JSF. JMX může být použita pro správu samotné JVM.
Výhody JMX Každá služba, kterou JMX agent může poskytovat, je nezávislý modul, který může být připojen podle potřeby. Specifikace JMX definuje množinu základních služeb, které mohou být rozšiřovány a dynamicky zaváděny. Sama JVM je mohutně instrumentována. V každé Java aplikaci je možno odstartovat JMX agenta, který zpřístupňuje vestavěnou instrumentaci JVM a tak ovládat JVM třeba vzdáleně. Java EE Aplikační Server je konformní s JMX architekturou a tak může být spravován technologií JMX. JMX je kompatibilní se standardními Java technologiemi.
Architektura JMX (1/3)
Architektura JMX (2/3) Technologie JMX se dělí na tři úrovně: instrumentace, JMX agent, vzdálená správa. Instrumentace prostředku znamená opatřit jej sadou správcovských operací. MBeany implemetují přístup k instrumentaci (tj. ke správcovským operacím prostředku). Typy MBean: standardní (Standard MBeans), dynamické (Dynamic MBeans), otevřené (Open MBeans), Model MBeans, MXBeans.
Architektura JMX (3/3) Standardní MBeany musí odpovídat návrhovým vzorům a rozhraním definovaným v JMX specifikaci. MBeany nejsou závislé na konkrétním JMX agentu ve kterém se registrují. Služby JMX agenta jsou realizovány také jako MBeany. Instrumentační úroveň JMX poskytuje oznamovací mechanizmus, který umožňuje MBeanám asynchronně vytvářet a předávat oznamovací události do vyšších úrovní.
Monitoring a správa JVM JVM má vestavěnou (built-in, out-of-the-box) instrumentaci, která umožňuje monitorovat a spravovat JVM JMX technologií. Pro správu JVM slouží tzv. platformní MXBeany, které jsou součástí Java SE. Každá platformní MXBeana zpřístupňuje část JVM funcionality: class-loading systém, just-in-time (JIT) compilation system, garbage collector etc. Java SE obsahuje standardní platform MBean server, ve kterém se platformní MXBeany registrují. U serveru se mohou registrovat jakékoliv další MBeany.
Platformní MXBeans ClassLoadingMXBean - class loading system of the JVM. CompilationMXBean - compilation system of the JVM. MemoryMXBean - memory system of the JVM. ThreadMXBean - threads system of the JVM. RuntimeMXBean - runtime system of the JVM. OperatingSystemMXBean - operating system on which the JVM is running. GarbageCollectorMXBean - garbage collector in the JVM. MemoryManagerMXBean - memory manager in the JVM. MemoryPoolMXBean - memory pool in the JVM. Příklad: RuntimeMXBean mxbean = ManagementFactory.getRuntimeMXBean(); // Get the standard attribute "VmVendor" String vendor = mxbean.getvmvendor();
VisualVM (1/2) Java VisualVM - grafická správcovká aplikace pro monitoring, ladění a profilování Java aplikcí. Nahrazuje většinu dřívějších řádkových prostředků: JConsole, jstat, jinfo, jstack, jmap Umožňuje sledování lokálních i vzdálených aplikací jednotným způsobem. Umožňuje: generovat výpisy heapu, sledovat úniky paměti, vyhledávat MBeany and provádět nad nimi operace, monitorovat garbage collector, provádět lightweight memory and CPU profiling.
VisualVM (2/2)
MBeany MBeana je managed Java objekt, vytvořený podle pravidel JMX specifikace. MBeana může reprezentovat: zařízení, aplikaci, jakýkoliv prostředek, který musí být spravován. MBeans nabízejí správcovské rozhraní, které se skládá z: množiny attributů, které mohou být čteny resp. nastavovány, množiny operací, dokumentace vlastní MBeany. MBeany mohou vysílat oznámení (notifications), při výskytu předdefinovaných událostí. JMX definuje více typů MBean: standardní (Standard) MBeany, MXBeany, dynamické (Dynamick) MBeany,
Standardní MBeany Standardní MBeana je definována: rozhraním s generickým jménem XxxMBean, třídou s generickým jménem Xxx, která rozhraní implemetuje. Každá metoda rozhraní definuje buď atribut nebo operaci v MBeaně: public interface HelloMBean { public void sayhello(); public int add(int x, int y); public String getname(); public int getcachesize(); public void setcachesize(int size); Getry a setry umožňují přístup a eventuální modifikaci atributů.
Implementace MBeany public class Hello implements HelloMBean { public void sayhello() { System.out.println("hello, world"); public int add(int x, int y) { return x + y; public String getname() { return this.name; public int getcachesize() { return this.cachesize; public synchronized void setcachesize(int size) { this.cachesize = size; System.out.println( "Cache size now " + this.cachesize); private final String name = "Reginald"; private int cachesize = DEFAULT_CACHE_SIZE; private static final int DEFAULT_CACHE_SIZE = 200;
JMX Agent JMX agent se skládá z: MBean serveru - správcovský objekt u kterého se MBeany registrují, množiny služeb pro správu MBean, alespoň jednoho komunikačního adaptéru nebo konektoru, které umožňují přístup správcovské aplikaci. JMX agent není závislý na instrumentovaných zdrojích (kterýkoliv instrumentovaný zdroj může používat jakéhokoliv JMX agenta), Přístup k MBean serveru se získává metodou getplatformmbeanserver(), která při prvním zavolání MBean server automaticky vytvoří. Každá MBeana se registruje pod jménem (instance třídy ObjectName). Syntaxe jména je dána JMX specifikací a musí obsahovat doménu a seznam property.
JMX Agent Example import java.lang.management.*; import javax.management.*; public class Main { public static void main(string[] args) throws Exception { MBeanServer mbs = ManagementFactory.getPlatformMBeanServer(); ObjectName name = new ObjectName("com.example:type=Hello"); Hello mbean = new Hello(); mbs.registermbean(mbean, name);...
MXBeany MXBeana je varianta standardní MBeany, která používá mapovaní komplexních typů na předem definovanou množinu datových typů (tzv otevřených - open types). MXBeana je použitelná pro jakéhokoliv klienta (klient nemusí mít přístup ke třídám implementujícím MXBeanu). Otevřené typy jsou definovány v balíku javax.management. openmbean Pravidla mapování: jednoduché typy se mapují samy na seben unchanged, komplexní typy (i.e. MemoryUsage) se mapují na typ CompositeDataSupport. MXBeana je popsána anotací @MXBean.
Příklad MXBeany (1/3) Příklad: monitorování datové struktury fronta: public interface QueueSamplerMXBean { public QueueSample getqueuesample(); public void clearqueue(); public class QueueSampler implements QueueSamplerMXBean { private Queue q; public QueueSampler(Queue queue) { q = queue; public QueueSample getqueuesample() { synchronized (q) { return new QueueSample(q.size(), q.peek()); public void clearqueue() { synchronized (q) { q.clear();
Příklad MXBeany (2/3) MXBean framework používá: getry ze třídy QueueSample pro konverzi instance QueueSample na instanci CompositeData, anotaci @ConstructorProperties pro inverzní konverzi: import java.beans.constructorproperties; public class QueueSample { private final int size; private final String head; @ConstructorProperties({"size", "head") public QueueSample(int size, String head) { this.size = size; this.head = head; public int getsize() { return size; public String gethead() { return head;
Příklad MXBeany (3/3) import java.lang.management.managementfactory; import javax.management.mbeanserver; import javax.management.objectname; public class Main { public static void main(string[] args) throws Exception { MBeanServer mbs = ManagementFactory.getPlatformMBeanServer(); ObjectName mxbeanname = new ObjectName("com.example:type=QueueSampler"); Queue queue = new ArrayBlockingQueue(10); queue.add("request-1"); queue.add("request-2"); QueueSampler mxbean = new QueueSampler(queue); mbs.registermbean(mxbean, mxbeanname);...
Oznámení (1/3) MBeany mohou asynchronně generovat oznámení (notification), které může například signalizovat změnu stavu, výskyt chyby atp. Aby mohla MBean generovat oznámení, musí implementovat rozhraní NotificationEmitter nebo rozšiřovat třídu NotificationBroadcasterSupport. Vlastní oznámení je instance třídy Notification nebo její podtřídy (např. AttributeChangedNotification) a odesílá se metodou: NotificationBroadcasterSupport.sendNotification. Oznámení má: zdroj - jméno MBeany která je vygenerovala. pořadové číslo - může být použito k uspořádání oznámení, které jsou doručeny "napřeskáčku".
Oznámení (2/3) import javax.management.*; public class Hello extends NotificationBroadcasterSupport implements HelloMBean { private final String name = "Reginald"; private int cachesize = DEFAULT_CACHE_SIZE; private static final int DEFAULT_CACHE_SIZE = 200; private long sequencenumber = 1; public synchronized void setcachesize (int size) { int oldsize = this.cachesize; this.cachesize = size; Notification n = new AttributeChangeNotification(this, sequencenumber++, System.currentTimeMillis(), "CacheSize changed", "CacheSize", "int", oldsize, this.cachesize); sendnotification(n);
Oznámení (3 / 3) @Override public MBeanNotificationInfo[] getnotificationinfo() { String[] types = new String[] { AttributeChangeNotification.ATTRIBUTE_CHANGE ; String name = AttributeChangeNotification.class.getName(); String description = "An attribute of this MBean has changed"; MBeanNotificationInfo info = new MBeanNotificationInfo(types, name, description); return new MBeanNotificationInfo[] {info;
Vzdálená správa Vzdálená správa se provádí pomocí: adaptéru, konektoru Adaptéry realizují různé protokoly, které zpřístupňují zaregistrované MBeany klientům (i nejavovským). Adaptéry mohou využívat jak stávající správcovské protokoly (např. Simple Network Management Protocol - SNMP), tak proprietární protokoly. Např. HTML adaptér může zobrazovat MBeany v prohlížeči.
Konektory Konektory umožňují přístup k JMX agentu vzdáleným klientům vytvořeným v Javě. Skládají se ze: serveru konektoru - je připojen k JMX agentu a vyřizuje žádosti o připojení od klientů, klienta konektoru - je zodpovědný za vytvoření spojení se serverem konektoru. Klient konektoru běží obvykle na jiné JVM než server konektoru a často běží i na jiném počítači. Klient konektoru poskytuje stejné rozhraní jako JMX agent, a tak umožňuje vzdálenému klientovi provádět stejné operace jako lokálnímu. Různé konektory mohou používat různé protokoly. JMX API definuje standardní konektor založený na RMI.
Klient RMI konektoru Příklad: Třída Client tvoří klienta RMI konektoru: import javax.management.remote.jmxconnector; import javax.management.remote.jmxconnectorfactory; import javax.management.remote.jmxserviceurl; public class Client { public static void main(string[] args) throws Exception { JMXServiceURL url = new JMXServiceURL( "service:jmx:rmi:///jndi/rmi://:9999/jmxrmi"); JMXConnector jmxc = JMXConnectorFactory.connect(url, null);
Posluchač oznámení public static class ClientListener implements NotificationListener { public void handlenotification( Notification notification, Object handback) { String message = notification.getmessage(); if (notification instanceof AttributeChangeNotification) { AttributeChangeNotification acn = (AttributeChangeNotification) notification; String attributename = acn.getattributename()); String attributetype = acn.getattributetype()); Object newvalue = acn.getnewvalue()); Object oldvalue = acn.getoldvalue());...
Vytvoření spojení s MBean Serverem // Vytvoření spojení se vzdáleným MBean server MBeanServerConnection mbsc = jmxc.getmbeanserverconnection(); // Instalace NotificationListener ClientListener listener = new ClientListener(); mbsc.addnotificationlistener(mbeanname, listener, null, null); // Získání informací o MBeanách registrovaných // u MBean serveru String domains[] = mbsc.getdomains(); String defaultdomain = mbsc.getdefaultdomain()); int count = mbsc.getmbeancount()); Set mbeannames = new TreeSet(mbsc.queryNames(null, null));
MBean proxy Metody JMX.newMBeanProxy resp. JMX.newMXBeanProxy umožňují vytvořit ve vzdáleném klientovi proxy, která MBeanu emuluje: ObjectName mxbeanname = new ObjectName("com.example:type=QueueSampler"); QueueSamplerMXBean mxbeanproxy = JMX.newMXBeanProxy(mbsc, mxbeanname, QueueSamplerMXBean.class); QueueSample queue = mxbeanproxy.getqueuesample(); Date date = queue.getdate(); String head = queue.gethead(); int size = queue.getsize(); mxbeanproxy.clearqueue();