注册多个MBean类相同的MBean

时间:2013-04-25 11:18:17

标签: java jmx mbeans

我想注册多个同类的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 objectMBean

的属性值

1 个答案:

答案 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"));
相关问题