13 June 2007

Groovy + JMX documentation

Got a note recently from one of the Groovy developers that he'd authored some documentation around the use of JMX and Groovy. Very nicely he included examples of connecting to OC4J.

Good job Paul!

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

** Small update: I just tried the script and I couldn't get the code example for OC4J to work as it was listed on the site. I had to make a few minor alterations to get it to work for me. Here's the groovy script I have now which works against Groovy 1.0.

The script does work as it is shown against Groovy 1.1 which has an enhanced GroovyMBean constructor that can now takes the target MBean name in String form in addition to the earlier ObjectName form.

import oracle.oc4j.admin.jmx.remote.api.*
import javax.management.remote.*
import javax.management.*

def serverUrl = new JMXServiceURL('service:jmx:rmi://localhost:23791')
def serverPath = 'oc4j:j2eeType=J2EEServer,name=standalone'
def jvmPath = 'oc4j:j2eeType=JVM,name=single,J2EEServer=standalone'
def provider = 'oracle.oc4j.admin.jmx.remote'

def credentials = [
(JMXConnectorConstant.CREDENTIALS_LOGIN_KEY): 'oc4jadmin',
(JMXConnectorConstant.CREDENTIALS_PASSWORD_KEY): 'welcome1'
]
def env = [
(JMXConnectorFactory.PROTOCOL_PROVIDER_PACKAGES): provider,
(JMXConnector.CREDENTIALS): credentials
]
//def MBeanServerConnection server = (MBeanServerConnection)JMXConnectorFactory.connect(serverUrl, env).mBeanServerConnection
def server = JMXConnectorFactory.connect(serverUrl, env).mBeanServerConnection
def serverInfo = new GroovyMBean(server, new ObjectName(serverPath))
def jvmInfo = new GroovyMBean(server, new ObjectName(jvmPath))
println """Connected to $serverInfo.node. \
Server started ${new Date(serverInfo.startTime)}.
OC4J version: $serverInfo.serverVersion from $serverInfo.serverVendor
JVM version: $jvmInfo.javaVersion from $jvmInfo.javaVendor
Memory usage: $jvmInfo.freeMemory bytes free, \
$jvmInfo.totalMemory bytes total
"""

def query = new ObjectName('oc4j:*')
String[] allNames = server.queryNames(query, null)
def dests = allNames.findAll{ name ->
name.contains('j2eeType=JMSDestinationResource')
}.collect{ new GroovyMBean(server, new ObjectName(it)) }

println "Found ${dests.size()} JMS destinations. Listing ..."
dests.each{ d -> println "$d.name: $d.location" }

4 comments:

paulk_asert said...

Yes, the example on the Groovy wiki uses the new constructor in Groovy 1.1 which allows you to create GroovyMBeans just using their String name rather than creating a new ObjectName(name).

Buttso said...

Thanks for the clarification -- sounds like a good enhancement for 1.1.

Middleware said...

I am trying to get the statistics information for the JDBC connection pool like PoolSize, FreePoolSize,WaitingThreadCount. Do you have any thoughts how I can do that ?

Buttso said...

OC4J supports the JSR 77 model, so a range of statistics are available from the relevant JDBC/DataSource MBeans.

The Javadoc for the OC4J MBeans is here:

http://download-west.oracle.com/docs/cd/B31017_01/web.1013/e10288/toc.htm

A good way to explore is to use either the MBean browser available in the OC4J admin console, or to run OC4J with JMX platform server enabled and connect to it using JConsole.

If you then want to script this, then Groovy will work very nicely. The later versions of Groovy have nice support for creating JMX connections, so I'd just go with that, connect to the OC4J instance, then query and work with the set of relevant JDBC related MBeans you've discovered from exploring with JConsole/EM.

-steve-