Я относительно новичок в Managed Beans в java, и я пытаюсь понять, почему я получаю исключение. После запуска 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));
}
}
Это исключение я получаю
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
Из того, что я сказал, Так как мы хотим, чтобы запустить методы непосредственно, эта линия обрабатывает, что \t \t this.mbean = ((HelloMBean) MBeanServerInvocationHandler.newProxyInstance (this.mbs, имя, HelloMBean.class, ложь)); –
Класс MBean com.mbeans.Worker не реализует DynamicMBean и не следует стандартным соглашениям MBean (javax.management.NotCompliantMBeanException: класс com.mbeans.Worker не соответствует стандарту JMX Standard MBean), ни соглашениям MXBean (javax.management. NotCompliantMBeanException: com.mbeans.Worker: класс com.mbeans.Worker не совместим с JMX MXBean) –
Обновлено. Mbean - это Hello, и это нужно зарегистрировать, а не работника. Прокси-сервер-запрос еще требует зарегистрированного mbean, он просто преобразует вызовы методов в сырые вызовы JMX. – Nicholas