我想注册多个同类的MBean。
我有Hello
类实现HelloMBean
接口。
现在在main中我有两个Hello
类对象,我想同时注册它们
MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
ObjectName name = new ObjectName("mBeans:type=Hello");
Hello h1 = new Hello();
Hello h2 = new Hello();
mbs.registerMBean(h1, name);
mbs.registerMBean(h2, name);
这会抛出InstanceAlreadyExistsException
。
如何同时注册h1和h2,并使用jConsole查看它们?
原因,
我想更改h1 and h2 object
到MBean
答案 0 :(得分:2)
您需要使用唯一名称注册每个MBean。如果这样做,则在注册第二个MBean时将不再收到异常。您必须单独管理每个bean(即每个Home对象的属性通过各个MBean设置)。
MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
Hello h1 = new Hello();
Hello h2 = new Hello();
mbs.registerMBean(h1, new ObjectName("mBeans:type=Hello-1"));
mbs.registerMBean(h2, new ObjectName("mBeans:type=Hello-2"));
如果要通过一个MBean同时管理两个Hello
对象,(即一个MBean上的更改属性导致两个Hello对象发生更改),您可以尝试使用Composite Hello对象并将其公开为MBean。
通用界面:
interface IHello {
void setAttribute(int value);
}
单个hello对象:
class Hello implements IHello {
int attribute;
void setAttribute(int value) {
attribute = value;
}
}
复合hello对象:
class CompositeHello implements IHello {
IHello[] Hellos;
CompositeHome(IHello...hellos) {
super();
this.hellos = hellos;
}
void setAttribute(int value) {
for (IHello hello : hello) {
home.setAttribute(value);
}
}
}
注册复合MBean:
MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
Hello h1 = new Hello();
Hello h2 = new Hello();
CompositeHello composite = new CompositeHello(h1, h2);
mbs.registerMBean(composite, new ObjectName("mBeans:type=Hello"));