0

我正在尝试从我的 Spring 应用程序连接到 MBean 服务器。下面是代码:

public void connect() throws Exception {

    MBeanServerConnectionFactoryBean bean = new MBeanServerConnectionFactoryBean();
    bean.setConnectOnStartup(false);

    Properties environment = new Properties();

    environment.put("java.naming.factory.initial", "com.sun.jndi.rmi.registry.RegistryContextFactory");
    environment.put("java.naming.provider.url", "rmi://117.13.128.104:9308");
    environment.put("jmx.remote.jndi.rebind", "true");

    bean.setEnvironment(environment);
    bean.setServiceUrl("service:jmx:rmi://117.13.128.104/jndi/rmi://117.13.128.104:9308/agent/EODServer");
    bean.afterPropertiesSet();

    MBeanServerConnection server = (MBeanServerConnection)bean.getObject();

    System.out.println("test"); // After bean.getObject() - Debug pointer on this line.
}

调试指针是在 bean.getObject() 方法调用之后设置的。

在调试上面的代码时,我得到 MBeanServerConnection 服务器的值低于:

com.sun.jdi.InvocationException 发生调用方法。

MBeanServerConnectionFactoryBean 的 Environment 和 ServiceUrl 的值设置正确,为什么它没有连接到 MBean Server?

4

2 回答 2

0

我不熟悉那个特定的实用程序,但看起来 JNDI 和 JMX 配置之间存在一些奇怪的重叠。为什么不简化并只使用 JDK 自己的JMXConnectorFactory

import javax.management.*;
import javax.management.remote.*;
...
JMXConnector connector = JMXConnectorFactory.connect("service:jmx:rmi://117.13.128.104/jndi/rmi://117.13.128.104:9308/agent/EODServer");
MBeanServerConnection connection = connector.getMBeanServerConnection();

从技术上讲,如果需要,您可以使用以下方法将环境贴图添加到组合中:

JMXConnector connector = JMXConnectorFactory.connect("service:jmx:rmi://117.13.128.104/jndi/rmi://117.13.128.104:9308/agent/EODServer", environment);

...但在我看来,默认连接器和 JMXServiceURL 的内容已经暗示了您正在使用的环境。

于 2013-05-02T14:56:39.073 回答
0

在将 java.rmi.server.ignoreStubClasses 系统属性设置为 true 后,它得到了解决。

System.setProperty("java.rmi.server.ignoreStubClasses", "true");
于 2015-07-15T12:53:31.693 回答