先週はMXBeanを作成しました。今週はその続きです。

jconsoleは属性値が数値の場合,グラフを表示できます。例えば,先週作成したCounterWatcherでは,図1のようになります。

カウンタを参照
図1 カウンタを参照

Counterは0から10の値を取るのですが,このグラフには最大値が10であることは考慮されていません。

属性の取りうる値や単位など,MBeanのメタデータに関してはMBeanInfoクラスやMBeanAttributeInfoクラスなどに記述していました。しかし,それが使いやすいかといえば,かなり疑問が残ります。

Java SE 6ではメタデータをDescriporインタフェースを使用して表せます。もともとModel MBeanだけは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は使用した場合です。

@DescriptorKeyを使用しない場合
図2 @DescriptorKeyを使用しない場合
@DescriptorKeyを使用した場合
図3 @DescriptorKeyを使用した場合

ここで設定したmaxValueとminValueは,MBeanServerConnectionクラスを使用して取得できます。したがって,第6回で解説したようにjconsoleにCounterWatcher用のタブを作成するのであれば,これらの値を使用できます。

著者紹介 櫻庭祐一

横河電機 ネットワーク開発センタ所属。Java in the Box 主筆

今月の櫻庭

秋も深まりつつある今日この頃。櫻庭の住んでいる東京でもそろそろ紅葉の時期になってきました。

カエデ,ナナカマド,ツタ,サクラなど,それぞれの色で秋の景色を彩っています。櫻庭が好きなのはニシキギ。名前のとおり錦のように赤い葉っぱが特徴です。

家のそばを通っているイチョウ並木もだんだんと黄色くなり始めてきました。日当たりのいい場所ほど,黄葉がはやくはじまるようです。イチョウが黄色くなる頃といえば,ギンナン。おいしいですよね。

と,今月も最後は食べ物の話題になってしまうのでした。