MBeanのメタデータを記述する- Descriptor
先週はMXBeanを作成しました。今週はその続きです。
jconsoleは属性値が数値の場合,グラフを表示できます。例えば,先週作成したCounterWatcherでは,図1のようになります。
| [tr] 図1 カウンタを参照 [/tr]
Counterは0から10の値を取るのですが,このグラフには最大値が10であることは考慮されていません。
属性の取りうる値や単位など,MBeanのメタデータに関してはMBeanInfoクラスやMBeanAttributeInfoクラスなどに記述していました。しかし,それが使いやすいかといえば,かなり疑問が残ります。
Java SE 6ではメタデータをDescriporインタフェースを使用して表せます。もともとModelMBeanだけはDescriptorインタフェースを使用することができたのですが,それがすべてのMBean/MXBeanで使用できるように拡張されたのです。
しかし,Descriptorインタフェースだけではまだまだ使うのが大変です。そこで,取り入れられたのが@DescriptorKeyアノテーションです。
@DescriptorKeyアノテーションを使ってみる@DescriptorKeyアノテーションはメタアノテーションです。メタアノーテションとは,アノテーションを修飾するためのアノテーションのことです。
つまり,MBean/MXBeanで@DescriptorKeyアノテーションを使うには,@DescriptorKeyアノテーションを使用したアノテーションを作成する必要があります。
ここでは,最大値と最小値を表すための@Rangeというアノテーションを作成してみましょう。
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import javax.management.DescriptorKey;
@Documented
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Range {
@DescriptorKey("maxValue")
int max();
@DescriptorKey("minValue")
int min();
}
アノテーションを作成するには,いくつかのメタアノテーションで修飾しなければなりません。
@DocumentedはJavadocなどでドキュメント化されることを示しています。@Targetは,ここで作成するアノテーションがどの要素に対して使用可能であるかを示します。ここではMETHODを指定しているので,@Rangeはメソッドに対して使用できることを示しています。@Retentionはアノテーションが適用される範囲を示します。RUNTIMEの場合は,実行時に@Rangeが使用できることを示しています。
@Rangeアノテーションが定義するプロパティはmaxとminです。それぞれを@DescriptorKeyアノテーションで修飾します。
@DescriptorKeyアノテーションの引数は,Descriptorで表せるプロパティを示しています。
Descriptorで表せるプロパティには,ここで使用したmaxValueやminValue以外に,defaultValueやunitsなどがあります。主なプロパティを表1に示しました。表1に示した以外のプロパティはDescriptorのJavadocを参照してください。
表1 DescriptorKeyで使用できる主なプロパティ
名前 型 説明 defaultValue Object プロパティなどのデフォルト値 maxValue Object プロパティなどの最大値 minValue Object プロパティなどの最小値 originalType String CompositeDataに変換されるプロパティやオートボクシングで変換される場合,元の型を記述する units String プロパティなどの単位
@Rangeアノテーションが作成できたので,先週作成したCounterWatcherインタフェースを@Rangeで修飾してみましょう。
@MXBean
public interface CounterWatcher {
@Range(max=10, min=0)
public int getCount();
public void reest();
}
getCountメソッドを@Rangeアノテーションで修飾します。このコードではmaxが10,minが0になります。これでコードの修正はおしまいです。直接,Descriptorインタフェースを使う場合に比べて,とても簡単にプロパティを指定できます。
それでは,jconsoleで試してみましょう。残念ながら,グラフにはmaxValueとminValueは反映されません。しかし,属性の記述子の部分を見てみると,ちゃんとmaxValueとminValueが設定されていることを確認できます。図2は@DescriptorKeyを使わなかった場合,図3は使用した場合です。
| [tr] 図2 @DescriptorKeyを使用しない場合 [/tr] | [tr] 図3 @DescriptorKeyを使用した場合 [/tr]
ここで設定したmaxValueとminValueは,MBeanServerConnectionクラスを使用して取得できます。したがって,第6回で解説したようにjconsoleにCounterWatcher用のタブを作成するのであれば,これらの値を使用できます。 |