27 października 2010

Geronimo, JMX i Groovy

Apache GeronimoDostał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ń (!)

3 komentarze:

  1. GroovyMBean na ratunek - Po grooviowemu mozesz po prostu napisac:

    println(new GroovyMBean(serverUrl, beanName).kernelBootTime);

    Wiecej tu:
    http://groovy.codehaus.org/Groovy+and+JMX

    OdpowiedzUsuń
  2. Złośliwie napisze:
    > jconsole

    zakładka MBean :)

    P.S: Oczywiście z Java 6

    OdpowiedzUsuń
  3. @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.

    @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! :)

    OdpowiedzUsuń