2012-01-04 3 views
3

Я пытаюсь подключиться JConsole к JVM, вызываемой:Java Jconsole Сбой подключения JMX

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 = [email protected] 
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 = [email protected] 
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 = [email protected] 
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 

Первая попытка подключения выполнена успешно, так как на удаленном сервере я вижу соединение ESTABLISHED.

[email protected]:~> netstat -a | grep 12700 
tcp  0  0 *:12700      *:*       LISTEN  
tcp  0  0 tdiap12.vgcar.net:12700  per-00c0016253a2.vgca:12252 ESTABLISHED 

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

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

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

+0

Вы уверены, что брандмауэры на вашей машине не блокируются 12700? Я подозреваю из-за некоторой блокировки, jmx пытается использовать альтернативный порт. Попробуйте отключить брандмауэр. – kosa

+0

Когда я пытаюсь подключиться к локальной машине, удаленная машина показывает следующее: 'wse2tst @ tdiap12: ~> netstat -a | grep 12700 tcp 0 0 *: 12700 *: * LISTEN tcp 0 0 tdiap12.vgcar.net:12700 за-00c0016253a2.vgca: 12252 ESTABLISHED 'Я предполагаю, что соединение установлено и не блокируется локальное правило брандмауэра. Трассировка пакетов также указывает, что соединение выполнено успешно. – Steven

+0

Наверное, вам нужно добавить -Dcom.sun.management.jmxremote, в то время как вы поднимаете jvm, указанный вами в верхней части этого вопроса, разве нам не нужно? – kosa

ответ

6

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

Есть способы обойти его - либо вы можете сделать это самостоятельно manually, или если вы используете Tomcat, вы его даете handle it for you.

+0

Оказывается, еще один разработчик уже закодировал пользовательский агент, чтобы обойти проблему брандмауэра, блокирующего второй случайный порт. Я решил решить проблему, вместо того, чтобы устанавливать настраиваемый агент везде, где мне нужно было контролировать. (Я должен контролировать тонны серверов приложений.) Я сильно расстроился, потому что никогда не нашел документацию, идентифицирующую требование второго порта, но вы хотя бы подтвердили мои наблюдения, и это достаточно хорошо для меня. Спасибо за ответ. – Steven

5

новое и лучшее решение, чем при использовании вручную закодированный агента, чтобы использовать новый параметр, который, кажется, введенный в 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

0

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

спасибо

Смежные вопросы