我对mbeans有疑问。我已经创建了一个简单的mbean,我已经在运行的默认mBeanServer上注册了它(通过eclipse或java -jar mbean.jar),并且在同一个过程中,如果我尝试通过一个简单的查询来注册mbean:
for (ObjectInstance instance : mbs.queryMBeans(ObjectNameMbean, null)) {
System.out.println(instance.toString());
}
查询返回我的mbean,但如果我启动另一个进程并尝试搜索此mbean注册,则找不到mbeas!为什么呢?
approch是:(正在运行的进程)
public static void main(String[] args) throws Exception
{
MBeanServer mbeanServer =ManagementFactory.getPlatformMBeanServer();
ObjectName objectName = new ObjectName(ObjectNameMbean);
Simple simple = new Simple (1, 0);
mbeanServer.registerMBean(simple, objectName);
while (true)
{
wait (Is this necessary?)
}
}
所以这是第一个正在运行的进程(它只有注册mbean的pourpose,因为有另一个进程要读取这些信息。 所以我开始另一个进程来搜索这个mbean,但没有。 我不是使用jboss而是使用本地Java虚拟机,但我的范围是在一个ejb(自动启动)中部署这个简单的应用程序,另一个ejb将读取所有信息。 所有建议都非常赞赏。
这个例子应该更有用:
对象你好:
public class Hello implements HelloMBean {
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);
}
private final String name = "Reginald";
private int cacheSize = DEFAULT_CACHE_SIZE;
private static final int DEFAULT_CACHE_SIZE = 200;
}
接口HelloBean(由Hello实现)
public interface HelloMBean {
public void sayHello();
public int add(int x, int y);
public String getName();
public int getCacheSize();
public void setCacheSize(int size);
}
简单主要
import java.lang.management.ManagementFactory;
import java.util.logging.Logger;
import javax.management.MBeanServer;
import javax.management.ObjectName;
public class Main {
static Logger aLog = Logger.getLogger("MBeanTest");
public static void main(String[] args) {
try{
MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
ObjectName name = new ObjectName("ApplicationDomain:type=Hello");
Hello mbean = new Hello();
mbs.registerMBean(mbean, name);
// System.out.println(mbs.getAttribute(name, "Name"));
aLog.info("Waiting forever...");
Thread.sleep(Long.MAX_VALUE);
}
catch(Exception x){
x.printStackTrace();
aLog.info("exception");
}
}
}
所以现在我已将此项目导出为jar文件并将其作为“java -jar helloBean.jar”运行,并通过eclipse我修改了主类以读取此读取信息(示例“名称”属性),方法是使用用于注册它的相同对象名。
主要阅读:
public static void main(String[] args) {
try{
MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
ObjectName name = new ObjectName("ApplicationDomain:type=Hello");
System.out.println(mbs.getAttribute(name, "Name"));
}
catch(Exception x){
x.printStackTrace();
aLog.info("exception");
}
}
但没有,豆子没找到。
项目链接:here!
有什么想法吗?
答案 0 :(得分:1)
我怀疑这里的问题是你有多个MBeanServer实例。您没有提到在每种情况下如何获取MBeanServer,但在第二个代码示例中,您正在创建一个新的MBeanServer实例,该实例可能与其他线程正在读取的实例不同。 (我假设这一切都在一个JVM中......)
如果您使用的是平台代理,我建议您使用ManagementFactory获取MBeanServer,如下所示:
MBeanServer mbs = java.lang.management.ManagementFactory.getPlatformMBeanServer() ;
这样,您将始终获得相同的MBeanServer实例。