java - Jmx 客户端抛出 InstanceNotFoundException

标签 java intellij-idea client classpath jmx

我有一个 Jmx 客户端,用于测试我编写的 jmx bean。这是客户端的代码:

    JMXServiceURL url = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://localhost:8686/jmxrmi");
    JMXConnector jmxc = JMXConnectorFactory.connect(url, null);

    MBeanServerConnection mbsc = jmxc.getMBeanServerConnection();
    ObjectName mbeanName = new ObjectName("com.spmsoftware.processing.ping:type=ProcessingPing");

    ProcessingPing mbeanProxy = JMX.newMBeanProxy(mbsc, mbeanName, ProcessingPing.class, true);
    System.out.println("\nResult = " + mbeanProxy.ping(346, 0).getResultCode());

    jmxc.close();

ProcessingPing 及其所有依赖项都存在于 IntelliJ 的库中。

我的 jmx bean 是:

    public interface ProcessingPing {

        public PingResult ping(Integer environmentId, Integer timeout);
    }

    @Service("ProcessingPing")
    @ManagedResource(description = "")
    public class ProcessingPingImpl implements ProcessingPing {

        private static final Integer DEFAULT_TIMEOUT = 5000;

        @Autowired
        private PingProcessService pingProcessService;

        @Override
        @ManagedOperation(description = "")
        public PingResult ping(Integer environmentId, Integer timeout) {
            return pingProcessService.run(environmentId, timeout);
        }            
    }

运行时,客户端在尝试调用 ping 方法时出现异常:

    Caused by: javax.management.InstanceNotFoundException: com.spmsoftware.processing.ping:type=ProcessingPing
        at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.getMBean(DefaultMBeanServerInterceptor.java:1095)
        at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.getClassLoaderFor(DefaultMBeanServerInterceptor.java:1444)
        at com.sun.jmx.mbeanserver.JmxMBeanServer.getClassLoaderFor(JmxMBeanServer.java:1308)
        at com.sun.enterprise.v3.admin.DynamicInterceptor.getClassLoaderFor(DynamicInterceptor.java:907)
        at javax.management.remote.rmi.RMIConnectionImpl$4.run(RMIConnectionImpl.java:1346)
        at java.security.AccessController.doPrivileged(Native Method)
        at javax.management.remote.rmi.RMIConnectionImpl.getClassLoaderFor(RMIConnectionImpl.java:1342)
        at javax.management.remote.rmi.RMIConnectionImpl.invoke(RMIConnectionImpl.java:795)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:601)
        at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:322)
        at sun.rmi.transport.Transport$1.run(Transport.java:177)
        at sun.rmi.transport.Transport$1.run(Transport.java:174)
        at java.security.AccessController.doPrivileged(Native Method)
        at sun.rmi.transport.Transport.serviceCall(Transport.java:173)
        at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:553)
        at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:808)
        at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:667)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
        at java.lang.Thread.run(Thread.java:722)
        at sun.rmi.transport.StreamRemoteCall.exceptionReceivedFromServer(StreamRemoteCall.java:273)
        at sun.rmi.transport.StreamRemoteCall.executeCall(StreamRemoteCall.java:251)
        at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:160)
        at com.sun.jmx.remote.internal.PRef.invoke(Unknown Source)
        at javax.management.remote.rmi.RMIConnectionImpl_Stub.invoke(Unknown Source)
        at javax.management.remote.rmi.RMIConnector$RemoteMBeanServerConnection.invoke(RMIConnector.java:1017)
    Disconnected from the target VM, address: '127.0.0.1:56621', transport: 'socket'
        at javax.management.MBeanServerInvocationHandler.invoke(MBeanServerInvocationHandler.java:305)
        ... 2 more

我不明白为什么jmx好像能拿到bean,却拿不到类的实际实例。我猜这是一个类路径问题,但找不到它。另一方面,当使用 JConsole 进行测试时,它工作正常。

谢谢

最佳答案

看起来用于注册 MBean 的对象名称与您在尝试检索托管 bean 时使用的对象名称不同。

尝试检查 JConsole 中的对象名称。

关于java - Jmx 客户端抛出 InstanceNotFoundException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15358407/

相关文章:

java - 如何在android中以YYYY-MM-DD HH:MI:Sec.Millisecond格式获取当前时间

intellij-idea - 开始规则 : <select from navigator or grammar> in antlr plugin in IntelliJ

C 套接字编程 - 从服务器写入(而不是客户端)写入服务器

java - Zendesk Java 客户端 API 更新 CustomFieldValue

java - 调用扫描器后方法不会更新 GUI

java - Tomcat 7 maven 插件-处理请求 : Broken pipe 时捕获的 I/O 异常 (java.net.SocketException)

java - 如何在 Java 中比较两个图像?

intellij-idea - Grails 设置同步失败。无法创建/Users/<username>/.grails/scripts/IdeaPrintProjectSettings.groovy

java - 使用 IntelliJ 在 Windows 10 上使用 gradle 依赖项导入失败

java - 是否可以使用java读取传入数据流,从服务器到.exe客户端(使用C++编码)?