MBean(JMX)を触る
MBean(JMX)を触ってみたメモです。
たまに調査でサーバのリモートJMXにつないでプロファイルを取得したりする機会はあるのですが、
MBeanを一度も手動で作成したことないな、と思ったので触ってみようと思いました。
下記バージョンで試してみます。
- kotlin 1.6.20
- jconsole 17.0.2
とりあえず下記のチュートリアルをやってみます。
https://docs.oracle.com/javase/jp/1.5.0/guide/jmx/index.html
まずは開示するプロパティと操作を持つインターフェースを定義します。
MBeanインターフェースのルールで、クラス名の末尾にMBean
をつけます。
このインターフェースは読み込みのみ出来るname
プロパティと、読み書き出来るcacheSize
プロパティを持ちます。
取得するためのメソッドはget
から始まりpublicである必要がありますが、kotlinなのでこのままで大丈夫です。
設定するためのメソッドはset
から始まり単一の引数を取るpublicメソッドである必要があります。これもkotlinなので大丈夫です。
add()
メソッドとsayHello()
メソッドの2つの関数も定義しておきます。
HelloMBean.kt
interface HelloMBean { val name: String var cacheSize: Int fun sayHello() fun add(x: Int, y: Int): Int }
次にHelloMBeanを実装したクラスを作成します。
name
は固定値を設定します。この値はval
で宣言しているので変更できません。
cacheSize
はデフォルト値を設定していますが、この値はvar
で宣言しているので変えることができます。
sayHello()
は単純な標準出力をし、add()
は2つの整数を足して返します。
Hello.kt
class Hello : HelloMBean { companion object { private const val DEFAULT_CACHE_SIZE = 200 } override val name = "Reginald" override var cacheSize = DEFAULT_CACHE_SIZE override fun sayHello() { println("hello, world") } override fun add(x: Int, y: Int) = x + y }
MBeanサーバを取得し、MBeanを登録します。
MBeanのオブジェクト名定義のためにObjectName
を作成し、Hello
MBeanのインスタンスを作成して
MBeanサーバに登録します。
実行後スリープして起動したままにしておきます。
Main.kt
fun main() { val mbs: MBeanServer = ManagementFactory.getPlatformMBeanServer() val name = ObjectName("com.example.jmx:type=Hello") val mbean = Hello() mbs.registerMBean(mbean, name) println("Waiting forever...") Thread.sleep(Long.MAX_VALUE) }
起動
Waiting forever...
jconsoleでアクセスしてみます。
jconsoleを起動して起動したアプリケーションのプロセスを選択します。
Hello
を選択するとMBeanの情報が見れます。
属性を選択するとCacheSize
とName
の値を参照できます。
Name
を選択すると、書き込み可能がfalse
になっていることがわかります。
CacheSize
を選択すると、書き込み可能がtrue
になっていることがわかります。
操作を選択するとadd
とsayHello
のメソッドを参照できます。
add
を選択し、数値を入力してadd
ボタンを押してみます。
add
の結果がポップアップで表示されました。
sayHello
を選択し、sayHello
ボタンを押してみます。
コンソールにhello, world
が表示されました。
hello, world
サンプルコードは下記にあげました。
おわり。
【参考】
https://docs.oracle.com/javase/jp/1.5.0/guide/jmx/index.html
https://www.javainthebox.net/laboratory/J2SE1.5/MonitoringAndManagement/JMX/JMX1.html
https://blog.cybozu.io/entry/2018/02/05/080000
https://docs.oracle.com/cd/F25597_01/document/products/wls/docs90/jmxinst/understanding.html