2016-04-20 25 views
0

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 bin
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 

Antwort

1

Sie haben nicht registered Ihre MBean. Es ist wahrscheinlich keine Best Practice, um dies zu tun, aber Sie könnten die Registrierung zu Ihrem Worker Konstruktor hinzufügen, nur um die Dinge in Gang zu bringen. Fügen Sie diese Zeile zu Ihrem Konstruktor nach der Erstellung des ObjektName:

this.mbs.registerMBean(this, name); 

(Sie müssen hinzufügen Fänge für eine Handvoll neuer Ausnahmen)

_------

Entschuldigung . Habe nicht genau genug gelesen. Sie müssen eine Instanz von Hello registrieren.

+0

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

+0

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) –

+0

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