2013-04-25 95 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")); 
相關問題