Подключение к серверу JMX весной вызывает исключение!

Поэтому, когда я пытаюсь подключиться к jmx из jconsole, я получаю это исключение:

Caused by: java.rmi.ConnectException: Connection refused to host: 78.84.17.116; nested exception is: 
    java.net.ConnectException: Connection timed out: connect
    at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:601)
    at sun.rmi.transport.tcp.TCPChannel.createConnection(TCPChannel.java:198)
    ...

Я пытался подключиться к такому URL-адресу в jconsole: service:jmx:rmi:///jndi/rmi://78.84.17.116:43030/test

Моя конфигурация jmx spring:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd">

    <context:mbean-server />

    <bean id="jmxExporter" class="org.springframework.jmx.export.MBeanExporter">
        <property name="server" ref="jmxServer" />
        <property name="assembler">
            <bean
                class="org.springframework.jmx.export.assembler.MetadataMBeanInfoAssembler">
                <property name="attributeSource">
                    <bean
                        class="org.springframework.jmx.export.annotation.AnnotationJmxAttributeSource" />
                </property>
            </bean>
        </property>

        <property name="beans">
            <map>
                <entry key="SpringBeans:name=hibernateStatisticsMBean"
                    value-ref="hibernateStatisticsMBean" />
            </map>
        </property>
    </bean>

    <bean id="jmxServer" class="org.springframework.jmx.support.MBeanServerFactoryBean"
        p:locateExistingServerIfPossible="false" />

    <bean id="serverConnector"
        class="org.springframework.jmx.support.ConnectorServerFactoryBean"
        depends-on="rmiRegistry" p:objectName="connector:name=rmi"
        p:serviceUrl="service:jmx:rmi://78.84.17.116/jndi/rmi://localhost:43030/test" />

    <bean name="hibernateStatisticsMBean" class="org.hibernate.jmx.StatisticsService">
        <property name="statisticsEnabled" value="true" />
        <property name="sessionFactory" ref="sessionFactory" />
    </bean>

    <bean id="rmiRegistry" class="org.springframework.remoting.rmi.RmiRegistryFactoryBean">
        <property name="port" value="43030" />
    </bean>
</beans>

Что я могу сделать неправильно, что jconsole не хочет подключаться к этому серверу jmx? И что означает test в конце URL-адреса jmx? Я только что увидел, что это так в учебнике, поэтому я написал то же самое в своем URL-адресе.

Редактировать 1: Когда я запускаю netstat -ntlp на сервере, я получаю следующее: tcp6 0 0 :::10099 :::* LISTEN 10754/java

Где 10754 — правильное Java-приложение. Это правильно? Запустив telnet ..*.* на 10099, я получаю сообщение, что он тоже к нему подключен. Я так понимаю это не брандмауэр на стороне сервера?

Редактировать 2: Хорошо, сейчас я пытаюсь (и приведенное ниже исключение также было вызвано на сервере) запустить приложение в моей локальной среде (в Eclipse), и я предполагаю, что это не проблема с сервером потому что все то же самое происходит.

Exception in thread "main" org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'serverConnector' defined in class path resource [META-INF/hw-common-jmx.xml]: Invocation of init method failed; nested exception is java.io.IOException: Cannot bind to URL [rmi://localhost:43030/test]: javax.naming.NoPermissionException [Root exception is java.rmi.ServerException: RemoteException occurred in server thread; nested exception is: 
    java.rmi.AccessException: Cannot modify this registry]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1420)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:519)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:291)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:288)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:190)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:563)
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:895)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:425)
    at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:139)
    at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:83)
    at star.Server.main(Server.java:31)
Caused by: java.io.IOException: Cannot bind to URL [rmi://localhost:43030/test]: javax.naming.NoPermissionException [Root exception is java.rmi.ServerException: RemoteException occurred in server thread; nested exception is: 
    java.rmi.AccessException: Cannot modify this registry]
    at javax.management.remote.rmi.RMIConnectorServer.newIOException(RMIConnectorServer.java:804)
    at javax.management.remote.rmi.RMIConnectorServer.start(RMIConnectorServer.java:417)
    at org.springframework.jmx.support.ConnectorServerFactoryBean.afterPropertiesSet(ConnectorServerFactoryBean.java:172)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1477)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1417)
    ... 12 more
Caused by: javax.naming.NoPermissionException [Root exception is java.rmi.ServerException: RemoteException occurred in server thread; nested exception is: 
    java.rmi.AccessException: Cannot modify this registry]
    at com.sun.jndi.rmi.registry.RegistryContext.bind(RegistryContext.java:126)
    at com.sun.jndi.toolkit.url.GenericURLContext.bind(GenericURLContext.java:208)
    at javax.naming.InitialContext.bind(InitialContext.java:400)
    at javax.management.remote.rmi.RMIConnectorServer.bind(RMIConnectorServer.java:625)
    at javax.management.remote.rmi.RMIConnectorServer.start(RMIConnectorServer.java:412)
    ... 15 more
Caused by: java.rmi.ServerException: RemoteException occurred in server thread; nested exception is: 
    java.rmi.AccessException: Cannot modify this registry
    at sun.rmi.server.UnicastServerRef.oldDispatch(UnicastServerRef.java:396)
    at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:250)
    at sun.rmi.transport.Transport$1.run(Transport.java:159)
    at java.security.AccessController.doPrivileged(Native Method)
    at sun.rmi.transport.Transport.serviceCall(Transport.java:155)
    at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:535)
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:790)
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:649)
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
    at java.lang.Thread.run(Thread.java:662)
    at sun.rmi.transport.StreamRemoteCall.exceptionReceivedFromServer(StreamRemoteCall.java:255)
    at sun.rmi.transport.StreamRemoteCall.executeCall(StreamRemoteCall.java:233)
    at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:359)
    at sun.rmi.registry.RegistryImpl_Stub.bind(Unknown Source)
    at com.sun.jndi.rmi.registry.RegistryContext.bind(RegistryContext.java:120)
    ... 19 more
Caused by: java.rmi.AccessException: Cannot modify this registry
    at sun.management.jmxremote.SingleEntryRegistry.bind(SingleEntryRegistry.java:61)
    at sun.rmi.registry.RegistryImpl_Skel.dispatch(Unknown Source)
    at sun.rmi.server.UnicastServerRef.oldDispatch(UnicastServerRef.java:386)
    at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:250)
    at sun.rmi.transport.Transport$1.run(Transport.java:159)
    at java.security.AccessController.doPrivileged(Native Method)
    at sun.rmi.transport.Transport.serviceCall(Transport.java:155)
    at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:535)
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:790)
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:649)
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
    at java.lang.Thread.run(Thread.java:662)

Может ли проблема быть в конфигурации? Может ли кто-нибудь проверить правильность моей конфигурации?

Редактировать 3: я получаю это каждый раз, когда запускаю приложение. Думаю, в этом проблема. Это происходит как на сервере, так и на моей машине.

01:40:21.588 [main] INFO  org.springframework.remoting.rmi.RmiRegistryFactoryBean - Looking for RMI registry at port '38457'
01:40:21.654 [main] DEBUG org.springframework.remoting.rmi.RmiRegistryFactoryBean - RMI registry access threw exception
java.rmi.ConnectException: Connection refused to host: 188.40.111.83; nested exception is: 
    java.net.ConnectException: Connection refused
    at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:601) ~[na:1.6.0_12]
    at sun.rmi.transport.tcp.TCPChannel.createConnection(TCPChannel.java:198) ~[na:1.6.0_12]
    at sun.rmi.transport.tcp.TCPChannel.newConnection(TCPChannel.java:184) ~[na:1.6.0_12]
    at sun.rmi.server.UnicastRef.newCall(UnicastRef.java:322) ~[na:1.6.0_12]
    at sun.rmi.registry.RegistryImpl_Stub.list(Unknown Source) ~[na:1.6.0_12]
    at org.springframework.remoting.rmi.RmiRegistryFactoryBean.testRegistry(RmiRegistryFactoryBean.java:281) [org.springframework.context-3.0.5.RELEASE.jar:3.0.5.RELEASE]
    at org.springframework.remoting.rmi.RmiRegistryFactoryBean.getRegistry(RmiRegistryFactoryBean.java:259) [org.springframework.context-3.0.5.RELEASE.jar:3.0.5.RELEASE]
    at org.springframework.remoting.rmi.RmiRegistryFactoryBean.getRegistry(RmiRegistryFactoryBean.java:236) [org.springframework.context-3.0.5.RELEASE.jar:3.0.5.RELEASE]
    at org.springframework.remoting.rmi.RmiRegistryFactoryBean.getRegistry(RmiRegistryFactoryBean.java:193) [org.springframework.context-3.0.5.RELEASE.jar:3.0.5.RELEASE]
    at org.springframework.remoting.rmi.RmiRegistryFactoryBean.afterPropertiesSet(RmiRegistryFactoryBean.java:164) [org.springframework.context-3.0.5.RELEASE.jar:3.0.5.RELEASE]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1477) [org.springframework.beans-3.0.5.RELEASE.jar:3.0.5.RELEASE]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1417) [org.springframework.beans-3.0.5.RELEASE.jar:3.0.5.RELEASE]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:519) [org.springframework.beans-3.0.5.RELEASE.jar:3.0.5.RELEASE]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456) [org.springframework.beans-3.0.5.RELEASE.jar:3.0.5.RELEASE]
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:291) [org.springframework.beans-3.0.5.RELEASE.jar:3.0.5.RELEASE]
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222) [org.springframework.beans-3.0.5.RELEASE.jar:3.0.5.RELEASE]
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:288) [org.springframework.beans-3.0.5.RELEASE.jar:3.0.5.RELEASE]
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:190) [org.springframework.beans-3.0.5.RELEASE.jar:3.0.5.RELEASE]
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:281) [org.springframework.beans-3.0.5.RELEASE.jar:3.0.5.RELEASE]
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:190) [org.springframework.beans-3.0.5.RELEASE.jar:3.0.5.RELEASE]
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:563) [org.springframework.beans-3.0.5.RELEASE.jar:3.0.5.RELEASE]
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:895) [org.springframework.context-3.0.5.RELEASE.jar:3.0.5.RELEASE]
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:425) [org.springframework.context-3.0.5.RELEASE.jar:3.0.5.RELEASE]
    at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:139) [org.springframework.context-3.0.5.RELEASE.jar:3.0.5.RELEASE]
    at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:83) [org.springframework.context-3.0.5.RELEASE.jar:3.0.5.RELEASE]
    at star.Server.main(Server.java:31) [star-engine-13.05.11.jar:na]
Caused by: java.net.ConnectException: Connection refused
    at java.net.PlainSocketImpl.socketConnect(Native Method) ~[na:1.6.0_12]
    at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:333) ~[na:1.6.0_12]
    at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:195) ~[na:1.6.0_12]
    at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:182) ~[na:1.6.0_12]
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:366) ~[na:1.6.0_12]
    at java.net.Socket.connect(Socket.java:519) ~[na:1.6.0_12]
    at java.net.Socket.connect(Socket.java:469) ~[na:1.6.0_12]
    at java.net.Socket.<init>(Socket.java:366) ~[na:1.6.0_12]
    at java.net.Socket.<init>(Socket.java:180) ~[na:1.6.0_12]
    at sun.rmi.transport.proxy.RMIDirectSocketFactory.createSocket(RMIDirectSocketFactory.java:22) ~[na:1.6.0_12]
    at sun.rmi.transport.proxy.RMIMasterSocketFactory.createSocket(RMIMasterSocketFactory.java:128) ~[na:1.6.0_12]
    at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:595) ~[na:1.6.0_12]
    ... 25 common frames omitted

person Rihards    schedule 11.05.2011    source источник
comment
У меня вообще нет опыта работы с JMX, но это пахнет брандмауэром.   -  person Erhan Bagdemir    schedule 11.05.2011
comment
да, брандмауэр или служба не работают, так как «Соединение отклонено».   -  person asgs    schedule 11.05.2011
comment
@erhan, хм, что мне делать, если это брандмауэр сервера? я немного слеп в брандмауэрах.   -  person Rihards    schedule 11.05.2011
comment
если вы используете tomcat в качестве контейнера, я помню, что где-то в catalina.properties была конфигурация jmx.port. Вы должны разрешить входящие/исходящие сообщения через порт jmx.   -  person Erhan Bagdemir    schedule 11.05.2011
comment
@erhan, ну, это вообще не веб-приложение, поэтому я не использую для него какой-либо сервер tomcat или jetty ... но для веб-приложений я использую jetty.   -  person Rihards    schedule 11.05.2011
comment
что бы вы ни разрабатывали, вы все равно могли смотреть с помощью некоторых инструментов (на Windows exp. Zonealarm) исходящий трафик или даже с помощью Wireshark, на какой порт доставляется запрос.   -  person Erhan Bagdemir    schedule 11.05.2011
comment
как это решает исключение?   -  person Rihards    schedule 11.05.2011


Ответы (2)


Попробуйте добавить следующие свойства системы, чтобы отключить безопасность:

 -Dcom.sun.management.jmxremote.authenticate=false
 -Dcom.sun.management.jmxremote.ssl=false 
 -Dcom.sun.management.jmxremote.port=39600 
person Tarlog    schedule 11.05.2011
comment
Ага. Вы должны добавить их в командную строку (если вы работаете из командной строки) или в какой-то JAVA_OPTS, если вы используете сервер - person Tarlog; 11.05.2011
comment
@tarlog, так и сделал, как вы сказали, и я получил это исключение: Exception in thread "main" org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'serverConnector' defined in class path resource [META-INF/hw-common-jmx.xml]: Invocation of init method failed; nested exception is java.io.IOException: Cannot bind to URL [rmi://localhost:39600/myconnector]: javax.naming.NoPermissionException [Root exception is java.rmi.ServerException: RemoteException occurred in server thread; nested exception is: java.rmi.AccessException: Cannot modify this registry] Нужна трассировка стека? - person Rihards; 11.05.2011
comment
Любая идея, что означают исключения доступа? - person Rihards; 11.05.2011
comment
вы работаете с SecurityManager? - person Tarlog; 11.05.2011
comment
@Tarlog, добавлена ​​трассировка стека (и один вопрос в основной пост) для исключения, которое возникает, когда я запускаю приложение с предоставленными вами системными свойствами. (Я просто изменил порт на 43030 в -Dcom.sun.management.jmxremote.port) - person Rihards; 11.05.2011
comment
@Tarlog, кстати, когда мое приложение не запускалось с этими параметрами, поэтому исключение не вызывалось на моем локальном компьютере, я попытался открыть jconsole и выбрать приложение по идентификатору процесса, и это сработало как шарм. Однако доступ к нему с URL-адресом не работал. - person Rihards; 11.05.2011
comment
@Tarlog, вы можете проверить правильность моего URL-адреса службы? Я действительно не понимаю, почему в нем должен быть локальный хост и мой ip, а в конце /test. Как должен выглядеть удаленный URL-адрес, который я ввожу в jconsole для подключения? - person Rihards; 11.05.2011
comment
@Tarlog, я сомневаюсь, что работаю с каким-либо менеджером безопасности. Не видел ничего подобного в моем приложении. - person Rihards; 11.05.2011
comment
Посмотрите, поможет ли эта ветка: forum.springsource.org/archive/index. php/t-26140.html - person Tarlog; 12.05.2011
comment
У меня были упомянутые свойства com.sun.management.jmxremote, но все же было AccessException. Затем я заменил использование RmiRegistryFactoryBean весной вызовом LocateRegistry.createRegistry(jmxPort) – и я мог зарегистрировать свои mbeans без получения исключений . Проблема возникла у меня только при запуске моей войны внутри встроенного Jetty (для теста интеграции). Когда я развернул свою войну на других серверах приложений, мне разрешили зарегистрировать свои mbeans. Похоже, что Jetty (9) автоматически создает удаленный реестр rmi на com.sun.management.jmxremote.port, но с другими настройками безопасности. - person joensson; 07.08.2014

Правильный ответ - установить alwaysCreate для вашего компонента RMI следующим образом:

    <bean id="rmiRegistry" class="org.springframework.remoting.rmi.RmiRegistryFactoryBean">
        <property name="alwaysCreate" value="true" />
    </bean>

Это предотвращает попытки bean-компонента установить соединение для поиска существующего реестра RMI.

person Paul Gregoire    schedule 24.04.2012
comment
В моем случае этого было недостаточно (Spring 3.2.5). Мне пришлось прекратить использование RmiRegistryFactoryBean и использовать register = LocateRegistry.createRegistry(jmxPort); прежде чем мне разрешили зарегистрировать что-либо. - person joensson; 07.08.2014