2016-04-20 4 views
0

私はJavaのManaged Beansに比較的新しいです。なぜ例外が発生しているのか理解しようとしています.Main.javaを実行した後、例外が底に貼り付けられます。それはjconsole上ですが、それは現れているようです。私は何が欠けていますか?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)); 


} 

} 

これは、私はあなたがregisteredあなたのMBeanを持っていない

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 

答えて

1

を取得しています例外です。それはおそらくベストプラクティスではありませんが、物事を進めるために登録者をWorkerコンストラクタに追加することができます。 ObjectNameの作成後、あなたのコンストラクタに次の行を追加します

this.mbs.registerMBean(this, name); 

(あなたが新しい例外の一握りのための漁獲量を追加する必要があります)

_------

申し訳ありません。十分に注意深く読まなかった。 Helloのインスタンスを登録する必要があります。私たちは、直接メソッドを実行したいので、私は、聞いていたものから

+0

は、この行が処理する\t \t this.mbean =((HelloMBean)MBeanServerInvocationHandler.newProxyInstance(this.mbs、名前、HelloMBean.class、偽)); –

+0

MBeanクラスcom.mbeans.WorkerはDynamicMBeanを実装しておらず、標準MBean規約(javax.management.NotCompliantMBeanException:クラスcom.mbeans.WorkerはJMX準拠の標準MBeanではありません)もMXBean規約(javax.management。 NotCompliantMBeanException:com.mbeans.Worker:クラスcom.mbeans.WorkerがJMX準拠のMXBeanでない場合 –

+0

が更新されました。 mbeanはHelloで、ワーカーではなく登録する必要があります。プロキシー呼び出し側はまだ登録されたmbeanを必要とします。メソッド呼び出しを生のJMX呼び出しに変換するだけです。 – Nicholas