首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

精通 Grails 在企业中使用 Grails(5)

精通 Grails 在企业中使用 Grails(5)

Groovy 中的 JMX我最后要向您展示的是如何以编程方式调试 JMX MBean。JConsole GUI 非常漂亮,能够从 Groovy 脚本进行更改更是增加了它的魅力。
开始之前,创建一个名为 testJmx.groovy 的文件,将清单 13 中的代码添加到该文件中:
清单 13. 在 Groovy 中调用一个远程 JMX 代理
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import javax.management.MBeanServerConnection
import javax.management.remote.JMXConnectorFactory
import javax.management.remote.JMXServiceURL

def agentUrl = "service:jmx:rmi:///jndi/rmi://localhost:9004/jmxrmi"
def connector = JMXConnectorFactory.connect(new JMXServiceURL(agentUrl))
def server = connector.mBeanServerConnection

println "Number of registered MBeans: ${server.mBeanCount}"

println "\nRegistered Domains:"
server.domains.each{println it}

println "\nRegistered MBeans:"
server.queryNames(null, null).each{println it}




如果 Grails 正在运行,应该可以看到如清单 14 所示的输出:
清单 14. testJmx.groovy 脚本的输出
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
$ groovy testJmx.groovy
Number of registered MBeans: 20

Registered Domains:
java.util.logging
JMImplementation
java.lang
log4j

Registered MBeans:
java.lang:type=MemoryManager,name=CodeCacheManager
java.lang:type=Compilation
java.lang:type=GarbageCollector,name=Copy
java.lang:type=MemoryPool,name=Eden Space
log4j:appender=stdout
java.lang:type=Runtime
log4j:hierarchy=default
log4j:logger=root
log4j:appender=stdout,layout=org.apache.log4j.PatternLayout
java.lang:type=ClassLoading
java.lang:type=MemoryPool,name=Survivor Space
java.lang:type=Threading
java.lang:type=GarbageCollector,name=MarkSweepCompact
java.util.logging:type=Logging
java.lang:type=Memory
java.lang:type=OperatingSystem
java.lang:type=MemoryPool,name=Code Cache
java.lang:type=MemoryPool,name=Tenured Gen
java.lang:type=MemoryPool,name=Perm Gen
JMImplementation:type=MBeanServerDelegate




警告 testJmx.groovy 脚本可能会抛出一条类似清单 15 所示的 groovy.lang.MissingMethodException:
清单 15. 可能抛出的 JMX 异常
Caught: groovy.lang.MissingMethodException: No signature of method: javax.management.remote.rmi.RMIConnector$RemoteMBeanServerConnection.queryNames() is applicable for argument types: (java.lang.String, null)
如果发生这种情况,请从 $GROOVY_HOME/lib 中删除 mx4j-3.0.2.jar。它包含在 Groovy 发布版中,以通过 JMX 支持 1.4 JDK,但它与 Java 平台的更高版本冲突。

这个脚本中有趣的部分来自 javax.management.MBeanServer,javax.management.MBeanServer是调用 connector.mBeanServerConnection时返回的(记住,Java 中的 getFoo()方法调用在 Groovy 中可以简写为 foo)。调用 server.mBeanCount返回已注册 MBean 的数量。调用 server.domains返回一个由域名组成的 String[]。域名是 MBean 标识符的第一部分 —用逗号分隔的名 / 值对列表完全限定名称。调用 server.queryNames(null, null)返回一个由所有已注册 MBean 组成的 Set(要更多地了解 MBeanServer类的可用方法,请参阅 参考资料)。
为了获得某个特定 MBean,请将清单 16 中的代码添加到脚本底部:
清单 16. 获得一个 MBean
1
2
3
println "\nHere is the Runtime MBean:"
def mbean = new GroovyMBean(server, "java.lang:type=Runtime")
println mbean




有了一个到 MBean 服务器的连接并知道 MBean 的名称后,使用一行即可获取一个新的 GroovyMBean。清单 17 显示了脚本输出:
清单 17. GroovyMBean输出
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Here is the Runtime MBean:
MBean Name:
java.lang:type=Runtime
  
Attributes:
(r) javax.management.openmbean.TabularData SystemProperties
(r) java.lang.String VmVersion
(r) java.lang.String VmName
(r) java.lang.String SpecName
(r) [Ljava.lang.String; InputArguments
(r) java.lang.String ManagementSpecVersion
(r) java.lang.String SpecVendor
(r) long Uptime
(r) long StartTime
(r) java.lang.String LibraryPath
(r) java.lang.String BootClassPath
(r) java.lang.String VmVendor
(r) java.lang.String ClassPath
(r) java.lang.String SpecVersion
(r) java.lang.String Name
(r) boolean BootClassPathSupported




是否还记得本文前面提到的 InputArguments?它们是传递给 JVM 的所有 -D参数。使用这些参数来确认您确实连接到了远程 JMX 代理。再添加两行代码(如清单 18 所示)以输出 String[]:
清单 18. 从运行时 MBean 获取 InputArguments
1
2
println "\nHere are the InputArguments:"
mbean.InputArguments.each{println it}




如果看到清单 19 所示的输出,就说明您圆满完成了所有任务:
清单 19. 显示 InputArguments
1
2
3
4
5
6
7
8
9
10
11
12
13
Here are the InputArguments:
-Xserver
-Xmx512M
-Dcom.sun.management.jmxremote
-Djava.rmi.server.hostname=localhost
-Dcom.sun.management.jmxremote.port=9004
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
-Dprogram.name=grails
-Dgroovy.starter.conf=/opt/grails/conf/groovy-starter.conf
-Dgrails.home=/opt/grails
-Dbase.dir=.
-Dtools.jar=/Library/Java/Home/lib/tools.jar

返回列表