2013-03-12 129 views
4

我有一个Jmx客户端,我用它来测试我写的一个jmx bean。以下是客户端的代码:Jmx客户端抛出InstanceNotFoundException

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豆:

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); 
     }    
    } 

当运行,客户端,我在尝试调用平方法时异常:

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进行测试时,它工作正常。

感谢

回答

7

看起来用来注册MBean从你试图检索管理bean时,使用对象名称不同的对象名称。

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

+0

你是说,“processingPing”与“ProcessingPing”?是的,这是一个错字,但改变它后我得到了相同的例外。 – sebi 2013-03-12 13:14:56

+3

我的意思是整个对象名称 - “com.spmsoftware.processing.ping:type = ProcessingPing”。 您能否确认此对象名称是否与您在JConsole中可以看到的名称相同 - MBeanInfo部分中的ObjectName行? – 2013-03-13 09:25:33

+0

嘿,谢谢你的提示。我用我的客户端列出了所有暴露的bean,并看到我的名字为“com.spmsoftware:name = ProcessingPing,product = optymyze”。我在ObjectName的构造函数中使用了它,并将其作为一种魅力。 – sebi 2013-03-13 09:37:36

0

看起来像定义的mbean中的对象名与您在JMX客户端代码中提供的对象名不同。 对象名称应该与您在java类中定义的内容完全匹配,就像下面的类m bean使用spring公开的那样。

示例 - 下面一行写着类 @ManagedResource的顶部(对象名=“com.spmsoftware.processing.ping:type=ProcessingPing”

或者你也可以检查jconsole.exe和去标签。MBean和检查的MBean的名称在左窗格中

0

在我来说,我忘了创建bean(在这些情况下ProcessingPingImpl)

注释的解决方案: 你可以在豆和@ComponentScan("com.company")使用@Component @ Configuration-Object。 (见http://docs.spring.io/spring-javaconfig/docs/1.0.0.M4/reference/html/ch06s02.html

或者你直接在@配置,对象创建bean这样的:

@Bean 
public ProcessingPing processingPing(){ 
    return new ProcessingPingImpl(); 
} 

XML解决方案:

<context:component-scan base-package="com.company" /> 

(见https://github.com/spring-by-example/spring-by-example/blob/master/enterprise/spring-jmx/src/test/resources/org/springbyexample/jmx/JmxTest-context.xml

或者没有组件扫描:

<bean id="processingPing" class="com.company.ProcessingPingImpl" /> 
相关问题