我正在尝试将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
答案 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]
}