0

この方法で MBean アプリを登録しました。

ObjectName appName = new ObjectName("testpack.Application:name=myApp");
MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
mbs.registerMBean(this, appName);

次に、登録されているすべてのインスタンスを次の方法で取得しようとしています。

for (ObjectInstance instance : mbs.queryMBeans(appName, null)) {
    System.out.println(instance.toString());
}

ただし、この同じ JVM で同じアプリの多くのインスタンスを実行しても、これは 1 つのインスタンスしか出力しません。私が誤解したことは何ですか?これを適切に行う方法は?


編集

すみません、MBean、JMX エージェント、サーバー、クライアントなどの基本的な用語を誤解していました。今、私のアプリは JMX クライアントである必要があり、共通の MBean を公開して、私のアプリ間で何らかの通信を行い、将来的には管理コンソールを所有する必要があります。

@Grayは、私が欲しいものについて尋ねていることを指摘してくれました。今、私は JMX を基礎から勉強していますが、いくつかの側面は明確でした。

4

1 に答える 1

2

編集:

つまり、ボックスで実行されている複数の JVM について話しているようです。コードを使用するManagementFactory.getPlatformMBeanServer()ことで、現在の JVMのみで Bean にアクセスしています。別の JVM インスタンスで Bean を見ようとしている場合は、JMX クライアントを使用してそのリモート プロセスに接続する必要があります。私のSimpleJMXパッケージを使用すると、次のようなことができます。

JmxClient client = new JmxClient("localhost", somePortNumber);
Set<ObjectName> objectNameSet = client.getBeanNames();
...

これが私の JmxClient のjavadocです。確かにこれを行う他のクライアントがあります。Java 6+にはそれらが組み込まれている可能性もあります.Java 6+で現在のコンピューター上のJVMインスタンスをプログラムで一覧表示する方法があることを私は知っています。私の SimpleJMX パッケージはそれを行いません。


質問を理解しているかどうかはわかりませんが、クラスのインスタンスが複数あると言っていると思いますがmyApp、JMX にはそのうちの 1 つしか表示されていません。

ObjectNameJMX 経由でクラスを個別に表示する場合は、クラスごとに固有のものを作成する必要があります。通常、フォルダーと Bean 名 (場合によってはSystem.identityHashCode(obj)) を使用して、オブジェクトの各インスタンスの一意の名前を取得します。

たとえば、多数のタイマー ファクトリ Bean があります。次のようなオブジェクト名があります。

mprew:00=timers,name=MailServerTimerFactory
mprew:00=timers,name=MysqlManagerTimerFactory
mprew:00=timers,name=PointsTimerFactory

それらはすべて同じクラスであり、Spring Bean を使用してそれらを明確に識別しています。

于 2012-06-15T13:30:21.820 に答える