0

アプリケーションのプロパティを変更できるように、mbeanを介して一部のアプリケーションにアクセスする必要があります。今、私はこれが2つの方法で行うことができると思います:

  1. まず、そのアプリケーションの開発者に、mbeanがアクセスする配列リストにすべてのアプリケーションプロパティを登録するように依頼します。

  2. 次に、開発者が編集可能なプロパティを登録するだけで、私のmbeanが読み取り可能/編集可能な(r / w)アプリケーションプロパティの両方にアクセスできるなど、他の方法がある場合。

これらのアプリケーションプロパティがJVMのどこに格納されているかわからないので、mbeanがそのオブジェクトにアクセスするだけですべてのアプリケーションプロパティを取得できるように、2番目のポイントを実装する方法はありますか?

4

2 に答える 2

1

ここには相反する要件があるようです。

  1. アプリケーションの最小限のコードを変更したい。
  2. 読み取りおよび/または書き込み用にすべてのプロパティを公開する必要があります。
  3. について話しているかもしれませんし、話していないかもしれませんSystem.getProperty(...)。そうでない場合は、さまざまなオブジェクトのフィールドについて話していると思います。

これを行うには (少なくとも) 2 つの方法があります。現在、ソース コードから mbeans をどのようにエクスポートしているかを知らなければ、特定の構成に合わせて回答を調整することはできません。私の答えは代わりに、SimpleJMX パッケージを使用してプロパティを公開する方法を示します。

あなたが話しているのであればSystem.getProperty(...)、任意のプロパティを照会して値を返すことができる JMX mbean を書くことができます。

@JmxOperation(description = "Query for property")
public String queryForProperty(String name) {
   return System.getProperty(name);
}

代わりに、オブジェクトのリストからフィールドをエクスポートする必要がある場合は、エクスポートする各フィールドに注釈を追加するか、委任を通じてフィールドをエクスポートする Bean を作成する必要があります。簡単な方法はないと思いますし、何をどのようにエクスポートするかについての何らかの情報がなくても、一連のオブジェクトを簡単にエクスポートできるパッケージを知りません。

SimpleJMX を使用すると、フィールドまたは get メソッドに注釈を付けてフィールドをエクスポートできます。

@JmxAttributeField(description = "Number of hits in the cache")
private int hitCount;
...

// this can also be specified as @JmxAttributeMethod on the getter/setter methods
@JmxAttributeMethod(description = "Number of misses in the cache")
private int getMissCount() {
    return missCount;
}

は、JMX による値の設定を許可する を@JmxAttributeFieldサポートしています。isWritable = trueセッターに注釈を付けて、@JmxAttributeMethod書き込み可能にすることもできます。

各クラスに注釈を追加したくない場合は、委譲によって値をエクスポートするある種の JMX コンテナー クラスを作成する必要があります。

 public class JmxPublisher {
     private Class1 object1;
     private Class2 object2;
     ...
     public JmxPublisher(Class1 object1, Class2 object2) {
         this.object1 = object1;
         this.object2 = object2;
         ...
     }

     @JmxAttributeMethod(description = "Number of hits in the cache")
     public int getClass1HitCount() {
        return object1.getHitCount();
     }
     @JmxAttributeMethod(description = "Shutdown the background thread")
     public void setClass2Shutdown(boolean shutdown) {
        return object2.setShutdown(shutdown);
     }
     ...
 }
于 2012-06-21T17:48:54.843 に答える
0

また、もっとはっきりと自分を表現するべきだと思います。
私が理解したことから、リモートアプリケーションにクエリを実行し、すべてのプロパティに関する情報を取得し、それらが読み取り専用、書き込み専用、またはRWであるかどうかを確認する方法を提供してみませんか?
このように、プロパティのリストはクライアントアプリケーションのソースコードで言及されません-おそらく、クライアントアプリケーションのユーザーにプロパティのリストを表示させ、編集できるプロパティを編集させ、編集できないようにする必要があります彼ができないプロパティ。

于 2012-06-21T16:11:10.953 に答える