我对 mbean 有疑问。我创建了一个简单的 mbean,并在运行的默认 mBeanServer 上注册了它(通过 eclipse 或 java -jar mbean.jar),如果我尝试通过简单查询找到注册的 mbean,则在同一过程中:
for (ObjectInstance instance : mbs.queryMBeans(ObjectNameMbean, null)) {
System.out.println(instance.toString());
}
查询返回我的 mbean,但如果我启动另一个进程并尝试搜索这个注册的 mbean,则找不到 mbeas!为什么?
方法是:(正在运行的进程)
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 的唯一目的,因为还有另一个进程想要读取这些信息。所以我启动另一个进程来搜索这个 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");
}
}
但是什么都没有,没有找到bean。
项目链接:这里!
任何的想法?