Ошибка подключения Java jconsole jmx

Я пытаюсь подключить jconsole к jvm, вызванному:

java \
-Djava.util.logging.config.file=./logging.properties \
-Dcom.sun.management.jmxremote.ssl=false \
-Dcom.sun.management.jmxremote.authenticate=false \
-Dcom.sun.management.jmxremote.port=12700 \
-cp . Sleep

Затем я пытаюсь запустить jconsole с помощью:

jconsole -J-Djava.util.logging.config.file=./logging.properties

Файл loggin.properties включает:

sun.rmi.level=FINEST

После открытия сокета на порт 12700 rmi пытается подключиться к другому порту:

FINER: [javax.management.remote.rmi.RMIConnector: jmxServiceURL=service:jmx:rmi:///jndi/rmi://10.40.243.12:12700/jmxrmi] connecting...
Jan 5, 2012 2:30:42 PM RMIConnector connect
FINER: [javax.management.remote.rmi.RMIConnector: jmxServiceURL=service:jmx:rmi:///jndi/rmi://10.40.243.12:12700/jmxrmi] finding stub...
Jan 5, 2012 2:30:43 PM sun.rmi.transport.tcp.TCPEndpoint <clinit>
FINE: JConsole.addHost: localHostKnown = true, localHost = 10.206.6.59
Jan 5, 2012 2:30:43 PM sun.rmi.server.UnicastRef newCall
FINE: JConsole.addHost: get connection
Jan 5, 2012 2:30:43 PM sun.rmi.transport.tcp.TCPTransport <init>
FINE: JConsole.addHost: Version = 2, ep = [10.206.6.59:0]
Jan 5, 2012 2:30:43 PM sun.rmi.transport.tcp.TCPEndpoint getLocalEndpoint
FINE: JConsole.addHost: created local endpoint for socket factory null on port 0
Jan 5, 2012 2:30:43 PM sun.rmi.transport.tcp.TCPChannel createConnection
FINE: JConsole.addHost: create connection
Jan 5, 2012 2:30:43 PM sun.rmi.transport.tcp.TCPEndpoint newSocket
FINER: JConsole.addHost: opening socket to [10.40.243.12:12700]
Jan 5, 2012 2:30:43 PM sun.rmi.transport.proxy.RMIMasterSocketFactory createSocket
FINE: JConsole.addHost: host: 10.40.243.12, port: 12700
Jan 5, 2012 2:30:43 PM sun.rmi.transport.tcp.TCPChannel createConnection
FINER: JConsole.addHost: server suggested 10.206.6.59:12306
Jan 5, 2012 2:30:43 PM sun.rmi.transport.tcp.TCPChannel createConnection
FINER: JConsole.addHost: using 10.206.6.59:0
Jan 5, 2012 2:30:43 PM sun.rmi.server.UnicastRef newCall
FINER: JConsole.addHost: create call context
Jan 5, 2012 2:30:43 PM sun.rmi.server.UnicastRef logClientCall
FINER: JConsole.addHost: outbound call: [endpoint:[10.40.243.12:12700](remote),objID:[0:0:0, 0]] : sun.rmi.registry.RegistryImpl_Stub[0:0:0, 0]: java.rmi.Remote lookup(java.lang.String)
Jan 5, 2012 2:30:43 PM sun.rmi.transport.StreamRemoteCall <init>
FINER: JConsole.addHost: write remote call header...
Jan 5, 2012 2:30:43 PM sun.rmi.transport.StreamRemoteCall getOutputStream
FINER: JConsole.addHost: getting output stream
Jan 5, 2012 2:30:43 PM sun.rmi.server.UnicastRef invoke
FINER: JConsole.addHost: execute call
Jan 5, 2012 2:30:43 PM sun.rmi.transport.StreamRemoteCall getInputStream
FINER: JConsole.addHost: getting input stream
Jan 5, 2012 2:30:43 PM sun.rmi.server.LoaderHandler loadClass
FINE: JConsole.addHost: name = "javax.management.remote.rmi.RMIServerImpl_Stub", codebase = "", defaultLoader = sun.misc.Launcher$AppClassLoader@a39137
Jan 5, 2012 2:30:43 PM sun.rmi.server.LoaderHandler loadClass
FINER: JConsole.addHost: class "javax.management.remote.rmi.RMIServerImpl_Stub" found via defaultLoader, defined by null
Jan 5, 2012 2:30:43 PM sun.rmi.server.LoaderHandler loadClass
FINE: JConsole.addHost: name = "java.rmi.server.RemoteStub", codebase = "", defaultLoader = sun.misc.Launcher$AppClassLoader@a39137
Jan 5, 2012 2:30:43 PM sun.rmi.server.LoaderHandler loadClass
FINER: JConsole.addHost: class "java.rmi.server.RemoteStub" found via defaultLoader, defined by null
Jan 5, 2012 2:30:43 PM sun.rmi.server.LoaderHandler loadClass
FINE: JConsole.addHost: name = "java.rmi.server.RemoteObject", codebase = "", defaultLoader = sun.misc.Launcher$AppClassLoader@a39137
Jan 5, 2012 2:30:43 PM sun.rmi.server.LoaderHandler loadClass
FINER: JConsole.addHost: class "java.rmi.server.RemoteObject" found via defaultLoader, defined by null
Jan 5, 2012 2:30:43 PM sun.rmi.server.UnicastRef done
FINE: JConsole.addHost: free connection (reuse = true)
Jan 5, 2012 2:30:43 PM sun.rmi.transport.tcp.TCPChannel free
FINE: JConsole.addHost: reuse connection
Jan 5, 2012 2:30:43 PM sun.rmi.transport.tcp.TCPChannel free
FINE: JConsole.addHost: create reaper
Jan 5, 2012 2:30:43 PM sun.rmi.server.UnicastRef newCall
FINE: JConsole.addHost: get connection
Jan 5, 2012 2:30:43 PM sun.rmi.transport.tcp.TCPChannel createConnection
FINE: JConsole.addHost: create connection
Jan 5, 2012 2:30:43 PM sun.rmi.transport.tcp.TCPEndpoint newSocket
FINER: JConsole.addHost: opening socket to [tdiap12:41096]
Jan 5, 2012 2:30:43 PM sun.rmi.transport.proxy.RMIMasterSocketFactory createSocket
FINE: JConsole.addHost: host: tdiap12, port: 41096

Первая попытка подключения успешна, потому что на удаленном сервере я вижу УСТАНОВЛЕННОЕ соединение.

wse2tst@tdiap12:~> netstat -a | grep 12700
tcp        0      0 *:12700                     *:*                         LISTEN      
tcp        0      0 tdiap12.vgcar.net:12700     per-00c0016253a2.vgca:12252 ESTABLISHED 

Трассировка пакета также указывает на успешное соединение.

Время ожидания второго подключения к порту 41096 истекает, и приложение jconsole сообщает об ошибке «Ошибка подключения» и также прерывает первое подключение. Почему предпринимается попытка второго подключения? Есть ли способ указать порт для этого второго соединения? Целевой сервер жестко контролируется, а другие порты блокируются правилами брандмауэра. При нескольких попытках подключения второй порт изменится на разные случайные значения.

Спасибо за любую помощь, Стив


person Steven    schedule 04.01.2012    source источник
comment
Вы уверены, что на вашей машине нет брандмауэров, блокирующих 12700? Я подозреваю, что из-за какой-то блокировки jmx пытается использовать альтернативный порт. Попробуйте отключить брандмауэр.   -  person kosa    schedule 05.01.2012
comment
Когда я пытаюсь подключиться с моего локального компьютера, удаленный компьютер показывает следующее:wse2tst@tdiap12:~> netstat -a | grep 12700 tcp 0 0 *:12700 *:* LISTEN tcp 0 0 tdiap12.vgcar.net:12700 per-00c0016253a2.vgca:12252 ESTABLISHED Я предполагаю, что соединение устанавливается и не блокируется локальным правилом брандмауэра. Трассировка пакета также указывает на то, что соединение установлено успешно.   -  person Steven    schedule 05.01.2012
comment
Я думаю, вам нужно добавить -Dcom.sun.management.jmxremote при вызове jvm, который вы указали поверх этого вопроса, разве нам не нужно?   -  person kosa    schedule 05.01.2012
comment
Я не видел этого в документации. Что бы это сделало? Первые два значения -Dcom.sun.management.jmxremote включают шифрование и безопасность. Третий определяет порт прослушивания для входящих соединений JMX. Я не думаю, что установка -Dcom.sun.management.jmxremote сама по себе как-то повлияет.   -  person Steven    schedule 05.01.2012
comment
Попробуй. Это позволяет вашей JVM искать удаленные соединения.   -  person kosa    schedule 05.01.2012
comment
Добавлено -Dcom.sun.management.jmxremote \\ в командную строку. Никакой разницы в поведении. На этот раз он попытался подключиться к порту 53657. Каждый раз по-разному.   -  person Steven    schedule 06.01.2012
comment
Тогда мне жаль! В качестве последней попытки я бы попробовал сделать то же самое с другой удаленной машины (если она доступна). Я сильно подозреваю, что что-то не так с удаленной машиной, к которой вы пытаетесь подключиться.   -  person kosa    schedule 06.01.2012
comment
Не беспокойся. Спасибо за предложения.   -  person Steven    schedule 06.01.2012
comment
@Steven, Не удается подключиться к XXXXXXXX:8091 с помощью службы: jmx:rmi:///jndi/rmi://XXXXXX:8091/jmxrmi Я получаю эту ошибку, где я ошибаюсь?   -  person Jet    schedule 30.01.2018


Ответы (4)


Готовая реализация JMX использует два порта — один для реестра (тот, который вы указали) и один для фактического соединения, которое выбирается случайным образом (!). Это довольно конструктивный недостаток, поскольку случайный выбор второго порта очень усложняет настройку брандмауэра.

Однако есть способы обойти это — либо вы можете сделать это самостоятельно вручную, либо если вы используете Tomcat, вы позволяете ему справиться с этим за вас.

person Jens Borgland    schedule 08.02.2012
comment
Оказывается, другой разработчик уже написал собственный агент, чтобы обойти проблему блокировки брандмауэром второго случайного порта. Я был полон решимости добраться до сути проблемы вместо того, чтобы устанавливать собственный агент везде, где мне нужно было отслеживать. (Мне приходится отслеживать тонны серверов приложений.) Я очень расстроился, потому что так и не нашел документации, определяющей требование второго порта, но вы, по крайней мере, подтвердили мои наблюдения, и этого для меня достаточно. Спасибо за ответ. - person Steven; 22.02.2012

новое и лучшее решение, чем использование агента, закодированного вручную, заключается в использовании нового параметра, который, по-видимому, введен в Java 7:

-Dcom.sun.management.jmxremote.rmi.port=7091

Таким образом, в комбинации можно использовать один и тот же порт:

-Dcom.sun.management.jmxremote.port=7091 -Dcom.sun.management.jmxremote.rmi.port=7091

Решение найдено здесь: http://hirt.se/blog/?p=289

person Markus    schedule 25.05.2016

убедитесь, что вы запускаете свое приложение, используя команду ниже,

java -Dcom.sun.management.jmxremote.port=9595 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -jar <your jar file name>

затем откройте jconsole с правами администратора; возможно, вы сможете подключиться без каких-либо проблем.

если вы хотите запустить несколько файлов jar, обязательно используйте разные порты; в противном случае он выдаст ошибку, говоря, что он уже привязан к JVM

person Isuru Dewasurendra    schedule 09.10.2018
comment
Пожалуйста, не публикуйте повторяющиеся ответы на несколько вопросов. - person meagar; 09.10.2018

Вы можете установить второй порт с параметром -"Dcom.sun.management.jmxremote.rmi.port", где номер порта может быть таким же, как и у первого. Даже после установки этого параметра будет запрашиваться небезопасное соединение ... пожалуйста, разрешите небезопасное соединение, только тогда оно позволит вам продолжить работу, иначе до тех пор, пока в журнале вы не обнаружите ошибку, не удалось подключиться: java.lang.SecurityException: Ожидается солнце.rmi Удаленная ссылка .server.UnicastRef2 в заглушке!

Спасибо

person Rajesh Katadi    schedule 18.04.2017