Dostałem zadanie rozpracowania dostępnych obiektów Java Management Extension (JMX) - MBeans - w serwerze aplikacyjnym Apache Geronimo. Osoba zlecająca potrzebowała monitorować Geronimo i kiedy dowiedziałem się o tym, od razu zaproponowałem wykorzystanie JMX. W końcu, po to ta technologia została stworzona.I przyszło mi stworzyć klienta ("Trzeba było się nie wychylać", ktoś mógłby krzyknąć).
Przeglądając różne materiały dotyczące JMX API, brakowało mi spójnego przykładu. Natchnęło mnie, aby napisać własnego. Chwila namysłu i padło na...Groovy. W końcu do tego typu zadań świetnie się nadaje.
(Gdyby nie fakt, że poszukiwanie rozwiązania trwało i musiałem sobie przypomnieć programowanie w Groovy, zacząłbym od...) Po chwili miałem działające rozwiązanie w groovysh.
import javax.management.ObjectName
import javax.management.remote.JMXConnectorFactory as JmxFactory
import javax.management.remote.JMXConnector as JmxConn
import javax.management.remote.JMXServiceURL as JmxUrl
serverUrl = 'service:jmx:rmi://localhost/jndi/rmi://localhost:1099/JMXConnector'
url = new JmxUrl(serverUrl)
creds = ["system", "manager"] as String[]
env = ["jmx.remote.credentials":creds]
jmxc = JmxFactory.connect(url, env)
server = jmxc.MBeanServerConnection;
for (d in server.domains) { println d }
mbeanName = "geronimo:J2EEServer=geronimo,name=JVM,j2eeType=JVM"
mbean = new ObjectName(mbeanName)
println server.getAttribute(mbean, "kernelBootTime")
jmxc.close();Trzeba jeszcze skrypcik lekko podrasować, aby użyć produkcyjnie, ale ogólny zarys już jest. Usprawnienia mile widziane. Mam nieodparte wrażenie, że zastosowałem właściwe narzędzie do problemu. A jak Ty podszedłbyś/podeszłabyś do tematu?
p.s. Podczas rozpoczęcia konferencji warsjawa 2010 pozwoliłem sobie zrobić dygresję, taki drobny żarcik, odnośnie kobiet na sali, kiedy to na moje pytanie - już nie pamiętam jakie - padła odpowiedź damskim głosem. Natychmiast przypomniałem sobie skecz z Monty Pythona - Stoning i ledwo udało mi się utrzymać powagę. Skecz bajka! Że też zawsze musi mnie "natchnąć" w trakcie publicznych wystąpień (!)
GroovyMBean na ratunek - Po grooviowemu mozesz po prostu napisac:
OdpowiedzUsuńprintln(new GroovyMBean(serverUrl, beanName).kernelBootTime);
Wiecej tu:
http://groovy.codehaus.org/Groovy+and+JMX
Złośliwie napisze:
OdpowiedzUsuń> jconsole
zakładka MBean :)
P.S: Oczywiście z Java 6
@pedro, to żadna złośliwość biorąc pod uwagę, że Geronimo dostarcza JMX Browser :-) Tu jednak chodziło o dostęp ze skryptu, który będzie wykonywany przez inne narzędzie do monitorowania.
OdpowiedzUsuń@popaprany, niesamowite, że o tym piszesz. Nie poznajesz układu kodu i nazw importowanych klas? Jakby podobne do tego ze wskazanej stronki :-) Miałem wskazać na tę stronę, ale ostatecznie zrezygnowałem (i dobrze, bo nie wiedziałbym, że czytasz mojego bloga! :)