6

OSGiコンテナで実行されているJava1.6のプラットフォームMBeansサーバーを使用しています。

主に統計カウンターとイベントにMBeanを使用します。それらの実装は1つのバンドルに含まれていますが、他のいくつかのバンドルでインスタンス化されています。すべてのMBeanは、プラットフォームMBeanサーバーに自己登録します。

問題は、JMX経由で接続してMBeanを照会すると、現在登録されているものだけが取得され、インスタンス化されるまで登録されないことです(静的クラスは最初のアクセスまで存在しないため、またはバンドルがまだ開始されていないか、最初に使用するまで存在しないロジックの奥深くにカウンターがあります)

MBeansサーバーでイベントを「登録」するためにサブスクライブする方法が必要です。または、サーバーに新しいMBeanが追加された時期を判断する他の方法。削除されたMBeanを検出することは追加のボーナスですが、必須ではありません。

私が得た唯一の解決策は、基本的に5秒ごとにサーバーをポーリングし、その結果を保存されたMBeanのリストと比較するスレッドです。これは非常に醜いです。

4

2 に答える 2

13

準拠しているすべての MBeanServer は、リスナーに MBean の登録および登録解除イベントを通知します。重要なのは、MBeanServerDelegate に通知リスナーを登録することです。

たとえば、javax.management.NotificationListener実装:

public class MBeanEventListener implements NotificationListener {
    public void handleNotification(Notification notification, Object handback) {
        MBeanServerNotification mbs = (MBeanServerNotification) notification;
        if(MBeanServerNotification.REGISTRATION_NOTIFICATION.equals(mbs.getType())) {
            log("MBean Registered [" + mbs.getMBeanName() + "]");
        } else if(MBeanServerNotification.UNREGISTRATION_NOTIFICATION.equals(mbs.getType())) {
            log("MBean Unregistered [" + mbs.getMBeanName() + "]");
        }
    }       
}

リスナーを登録するには、 MBeanServerDelegateに対して通知リスナーを追加します。実際に通知される MBean をフィルタリングする場合は、 MBeanServerNotificationFilterを使用できます。この例では、フィルターはすべての ObjectNames に対して有効になっています。

    // Get a reference to the target MBeanServer
    MBeanServerConnection server = ManagementFactory.getPlatformMBeanServer();
    MBeanServerNotificationFilter filter = new MBeanServerNotificationFilter();
    filter.enableAllObjectNames();
    server.addNotificationListener(MBeanServerDelegate.DELEGATE_NAME, new MBeanEventListener(), filter, null);

リスナーの実装は、MBean が登録または登録解除されるたびにコールバックを取得します。

于 2011-04-01T18:17:30.230 に答える
3

これは、どこかに存在するすべての MBean を表示したいように思えますが、コードがすべてを一度に作成するわけではないため、表示できません。

すべての実際の MBean に対して「ビュー」MBean を作成するコード ジェネレータを使用することをお勧めします。たとえば、クラスまたはマーカー インターフェイスを使用して MBean を検索します。ビュー Bean はすべて、起動時に作成する必要があります。

ここで、実際の MBean が登場すると、そのビューを参照して自分自身を接続する必要があります。

そうすれば、すべての MBean が常に可視になり、(ビュー MBean は非常に安価になるため) 起動にあまり影響がなく、ビュー MBean は実際の MBean の状態を伝えることができます。

[編集]新しい MBean がいつ登録されたかを本当に知りたい場合は、既存のMBeanServerand overrideを拡張しますregisterMBean(Object, ObjectName)MBeanServerSystem プロパティを設定して、新しい をインストールしますjavax.management.builder.initial

次に、この情報を公開する MBean を定義します。

于 2011-03-29T08:26:31.530 に答える