javax.management.InstanceNotFoundException

javax.management.InstanceNotFoundException,java,jmx,mbeans,Java,Jmx,Mbeans,我对java中的托管bean比较陌生,我正在试图找出为什么会出现异常。在运行Main.java之后,我将异常粘贴到底部。我试图在jconsole上查看它,但它似乎没有出现。我缺少什么 Hello.java package com.mbeans; public class Hello implements HelloMBean { private final String name = "Reginald"; private int cacheSize = DEFAULT_CACHE_SIZ

我对java中的托管bean比较陌生,我正在试图找出为什么会出现异常。在运行Main.java之后,我将异常粘贴到底部。我试图在jconsole上查看它,但它似乎没有出现。我缺少什么

Hello.java

package com.mbeans;

public class Hello implements HelloMBean {

private final String name = "Reginald"; 
private int cacheSize = DEFAULT_CACHE_SIZE; 
private static final int 
DEFAULT_CACHE_SIZE = 200; 

public void sayHello() { 
System.out.println("hello, world"); 
} 

public int add(int x, int y) { 
return x + y; 
} 

public String getName() { 
return this.name; 
}  

public int getCacheSize() { 
return this.cacheSize; 
} 

public synchronized void setCacheSize(int size) {

this.cacheSize = size; 
System.out.println("Cache size now " + this.cacheSize); 
} 

}
HelloMBean.java

package com.mbeans;

public interface HelloMBean { 

public void sayHello(); 
public int add(int x, int y); 

public String getName(); 

public int getCacheSize(); 
public void setCacheSize(int size); 
} 
Main.java

package com.mbeans;

import java.lang.management.*; 
import javax.management.*; 

public class Main { 

public static void main(String[] args) 
throws Exception { 


Worker worker = new Worker();

} 
} 
Worker.java

package com.mbeans;

import java.lang.management.ManagementFactory;
import java.util.logging.Level;

import javax.management.MBeanServer;
import javax.management.MBeanServerInvocationHandler;
import javax.management.MalformedObjectNameException;
import javax.management.ObjectName;


public class Worker {


MBeanServer mbs; 
HelloMBean mbean;

public Worker()
{

this.mbs = ManagementFactory.getPlatformMBeanServer();
ObjectName name = null;
try
{
name = new ObjectName("com.mbeans:type=HelloMBean");
}
catch (MalformedObjectNameException ex)
{
ex.printStackTrace();
}

try
{

this.mbean = ((HelloMBean)MBeanServerInvocationHandler.newProxyInstance(this.mbs, name, HelloMBean.class, false));


}
catch(Exception e)
{
e.printStackTrace();
}


System.out.println("online : " +this.mbean.add(3, 4));


}

}
这是我得到的例外

Exception in thread "main" java.lang.reflect.UndeclaredThrowableException
at com.sun.proxy.$Proxy2.add(Unknown Source)
at com.mbeans.Worker.<init>(Worker.java:45)
at com.mbeans.Main.main(Main.java:12)
Caused by: javax.management.InstanceNotFoundException: com.mbeans:type=HelloMBean
at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.getMBean(Unknown Source)
at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(Unknown Source)
at com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(Unknown Source)
at javax.management.MBeanServerInvocationHandler.invoke(Unknown Source)
... 3 more
线程“main”java.lang.reflect.UndeclaredThrowableException中的异常 位于com.sun.proxy.$Proxy2.add(未知源) 位于com.mbeans.Worker.(Worker.java:45) 位于com.mbeans.Main.Main(Main.java:12) 原因:javax.management.InstanceNotFoundException:com.mbeans:type=HelloMBean 位于com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.getMBean(未知源) 位于com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(未知源) 位于com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(未知源) 位于javax.management.MBeanServerInvocationHandler.invoke(未知源) ... 3个以上 您没有MBean。这样做可能不是最好的做法,但您可以将注册添加到Worker构造函数中,以使事情顺利进行。创建ObjectName后,将此行添加到构造函数:

this.mbs.registerMBean(this, name);
(您需要为少数新异常添加捕获)

_------


对不起。读得不够仔细。您需要注册Hello的一个实例。

据我所知,因为我们希望直接运行这些方法,所以这一行处理this.mbean=((HelloMBean)MBeanServerInvocationHandler.newProxyInstance(this.mbs,name,HelloMBean.class,false));MBean类com.mbeans.Worker不实现DynamicBean,也不遵循标准MBean约定(javax.management.NotCompliantMBeanException:class com.mbeans.Worker不是符合JMX的标准MBean)和MXBean约定(javax.management.NotCompliantMBeanException:com.mbeans.Worker:Class com.mbeans.Worker不是符合JMX的MXBean)更新。mbean是Hello,需要注册,而不是worker。代理调用程序仍然需要注册的mbean,它只是将方法调用转换为原始JMX调用。在创建对象名Hello mbean=new Hello();this.mbs.registerMBean之后,我添加了这两行(姆宾,姓名);