2

同じクラスの MBean を複数登録したい。

インターフェイスをHello実装するクラスがありHelloMBeanます。

今、主にクラスの2つのオブジェクトがあり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

4

1 に答える 1

2

各 MBean を一意の名前で登録する必要があります。これを行うと、2 番目の MBean を登録するときに例外を受け取ることはなくなります。各 Bean を個別に管理する必要があります (つまり、各ホーム オブジェクトの属性は個々の 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"));

Hello1 つの MBean を介して 2 つのオブジェクトを同時に管理する場合(つまり、1 つの MBean の属性を変更すると、両方の 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"));
于 2013-04-25T18:57:24.953 に答える