2013-04-25 94 views
2

我想注册一个以上同一类的MBean。注册多个具有相同MBean类的MBean

我有Hello类实现了HelloMBean接口。

现在主要我有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查看它们两个?


理性此,

我想通过MBean

+3

有不同的名字。 'mBeans:type = Hello,instance = 1'和'mBeans:type = Hello,instance = two' – 2013-04-25 12:22:48

回答

2

同时改变h1 and h2 object的属性值,您需要用唯一的名称来注册每个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的,(在一个MBean的结果对双方您好对象的变化,即改变属性),你可以尝试使用Composite Hello对象和暴露管理在同一时间两个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")); 
相关问题