Grails:将jconsole连接到指定端口上的本地进程

时间:2014-06-23 10:00:25

标签: java grails jmx jconsole

我正在尝试将jconsole连接到本地进程的指定端口。我可以使用PID连接到本地进程,但不使用远程选项 我使用的是ubuntu 14.04和JDK 1.7 这就是我正在做的运行我的应用程序。

grails  \
-Dcom.sun.management.jmxremote=true \
-Dcom.sun.management.jmxremote.port=9999 \
-Dcom.sun.management.jmxremote.authenticate=false \
-Dcom.sun.management.jmxremote.ssl=false \
-Djava.rmi.server.hostname=xxx.xxx.xxx.xxx \
-Dserver.port=8090 \
run-app

主机名-i 也为我提供了 xxx.xxx.xxx.xxx

2 个答案:

答案 0 :(得分:2)

Grails 2.3及更高版本默认使用"forked mode",其中运行run-app的JVM会生成一个单独的进程来运行目标应用程序。因此,您应该在-D中配置它们,而不是将grails选项传递给BuildConfig.groovy。找到grails.project.fork选项并添加jvmArgs

grails.project.fork = [
  run:[...., jvmArgs:['-Dcom.sun.management.jmxremote=true',
    '-Dcom.sun.management.jmxremote.port=9999', 
   // etc.
  ]]
]

在您正在执行的命令行上使用-D选项将在 grails 进程中设置JMX连接器,而不是在您的应用程序中。

答案 1 :(得分:1)

将以下代码添加到resources.groovy为我解决了这个问题。

String serverURL = grailsApplication.config.grails.serverURL
URL url = new URL(serverURL)
System.setProperty("java.rmi.server.hostname", "${url.host}")
rmiRegistry(org.springframework.remoting.rmi.RmiRegistryFactoryBean) {
    port = 9999
    alwaysCreate: true
}


serverConnector(org.springframework.jmx.support.ConnectorServerFactoryBean) { bean ->
    bean.dependsOn = ['rmiRegistry']
    objectName = "connector:name=rmi"
    serviceUrl = "service:jmx:rmi://${url.host}/jndi/rmi://${url.host}:9999/jmxrmi"
    environment = ['java.rmi.server.hostname'                 : "${url.host}",
                   'jmx.remote.x.password.file'               : "${grailsApplication.parentContext.getResource('/WEB-INF/jmx/jmxremote.password').file.absolutePath}",
                   'jmx.remote.x.access.file'                 : "${grailsApplication.parentContext.getResource('/WEB-INF/jmx/jmxremote.access').file.absolutePath}",
                   'com.sun.management.jmxremote.authenticate': true,
                   'com.sun.management.jmxremote.local.only'  : false,
                   'com.sun.management.jmxremote'             : true]
}