#java #grails #jmx #jconsole
#java #grails #jmx #jconsole
Вопрос:
Я пытаюсь подключить jconsole к указанному порту для локального процесса. Я могу подключиться к локальному процессу, используя PID, но не используя опцию remote.
Я использую 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
Комментарии:
1. Какая версия Grails? Если версия 2.3.x или более поздняя и приложение работает в разветвленном режиме, то эти
-D
параметры будут влиять на JVM, на которой выполняется Grails, а не на ту, на которой запущено целевое приложение.2. Я использую Grails 2.4.0 . Я запускаю приложение grails и jconsole как на локальном хосте. И у меня нет двух разных JVM, поэтому оба используют одно и то же.
Ответ №1:
В Grails 2.3 и более поздних версиях по умолчанию используется «разветвленный режим», когда 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
параметров в командной строке, как вы делаете в данный момент, настроит соединитель JMX в процессе grails, а не в вашем приложении.
Комментарии:
1. Все еще не повезло. Тогда как jconsole может подключаться с использованием локального процесса и pid. И я могу видеть все эти свойства в jconsole-> MBeans-> java.lang-> Время выполнения-> Атрибуты-> Системные свойства . И вместо grails 2.4.0 я также попробовал свой подход на grails 2.0.4, и там я также не могу подключиться, используя опцию удаленного процесса.
Ответ №2:
Добавление приведенного ниже кода в 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]
}