Ich bin relativ neu zu Managed Beans in Java und ich versuche herauszufinden, warum ich eine Ausnahme bekomme.Nach dem Ausführen von Main.java, bekomme ich die Ausnahme an der Unterseite eingefügt.Ich habe versucht zu sehen es auf jconsole, aber es scheint nicht zu erscheinen. Was iam ich vermisse?javax.management.InstanceNotFoundException
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));
}
}
Dies ist die Ausnahme i
immer binException 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
Von dem, was ich gesagt habe, da wir die Methoden direkt ausgeführt werden soll, übernimmt diese Linie, dass \t \t this.mbean = ((HelloMBean) MBeanServerInvocationHandler.newProxyInstance (this.mbs, name, HelloMBean.class, false)); –
MBean-Klasse com.mbeans.Worker implementiert DynamicMBean nicht und folgt weder den Standard-MBean-Konventionen (javax.management.NotCompliantMBeanException: Klasse com.mbeans.Worker ist keine JMX-kompatible Standard-MBean) noch den MXBean-Konventionen (javax.management. NotCompliantMBeanException: com.mbeans.Worker: Klasse com.mbeans.Worker ist kein JMX-kompatibles MXBean) –
Aktualisiert. Die mbean ist Hello und das muss registriert werden, nicht Arbeiter. Der Proxy-Invoker benötigt immer noch eine registrierte mbean, er konvertiert Methodenaufrufe einfach in unformatierte JMX-Aufrufe. – Nicholas