Grails: подключение jconsole к локальному процессу на указанном порту

#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]
}