Java Management Extensions APIは、Javaの標準管理APIです。
Javaのメモリ関連の稼働状況を確認するのにjconsoleなどで使われているものと同じ仕組みです。
APIは、とてもシンプルですがアプリケーション独自のパラメータを参照したり更新したりすることができるためとても強力です。
JMX概要
JMXを使う手順はおおよそ次の通りです。
- MBeanインタフェースの作成
- MBeanインタフェースを実装
- MBeanインタフェースを登録
- jconsoleから参照/設定
以下、簡単なサンプルを使って動かしてみます。
MBeanインタフェースの作成
JMXで管理するパラメータの設定/参照をするためのインタフェース(MBeanインタフェース)を作成します。
今回は、メッセージを設定/参照できるHelloMBeanインタフェースを作ります。
インタフェースは、デフォルトパッケージではなく、必ず適当なパッケージを指定する必要があります。
また、インタフェース名の末尾は、MBeanが必須です。
package samples.mbeans; public interface HelloMBean { public String getMessage(); public void setMessage(String message); }
MBeanインタフェースを実装/MBeanインタフェースを登録
HelloMBeanインタフェースを実装します。
JMXのサンプルでは、インタフェース名からMBeanを除外した名前を指定しているようです。
実装の中身は、単純なsetter/getterです。
mainメソッドの初めで作成したMBeanを登録しています。
登録する名前は、”[パッケージ名]:type=[MBeanクラス名]”でパラメータにアクセスするときに使います。
package samples.mbeans; import java.lang.management.ManagementFactory; import javax.management.MBeanServer; import javax.management.ObjectName; public class Hello implements HelloMBean { private String message; @Override public String getMessage() { return message; } @Override public void setMessage(String message) { this.message = message; } public static void main(String[] args) throws Exception { MBeanServer mbs = ManagementFactory.getPlatformMBeanServer(); ObjectName name = new ObjectName("samples.mbeans:type=Hello"); Hello mbean = new Hello(); mbean.setMessage("Hello, JMX World!!"); mbs.registerMBean(mbean, name); System.out.println("Waiting forever..."); Thread.sleep(Long.MAX_VALUE); } }
実行
このサンプルを実行します。
その際にいくつかパラメータを指定します。
jconsoleからアクセスする場合には、-Dcom.sun.management.jmxremoteだけでよいのですが他のパラメータも参考で記載しておきます。
$ java -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=1099 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false samples.mbeans.Hello Waiting forever...
jconsoleから参照/設定
jconsoleからアクセスしてみます。
jconsoleを起動すると選択画面にローカルプロセスが表示されるので選択します。
$ jconsole
監視
jconsoleは残念なことにコマンドラインで操作することができないようです。
cmdline-jmxclientというのがあるのでダウンロードし、以下のようにコマンドラインで値を取得することが可能です。
zabbix_senderと組み合わせるとZabbixで監視ができます。
$ java -jar cmdline-jmxclient-0.10.3.jar - localhost:1099 samples.mbeans:type=Hello Message 12/28/2011 22:46:14 +0900 org.archive.jmx.Client Message: Hello, JMX World!! $
トラブルシューティングでは、自前のコネクションプールのバグが原因というケースが多いのですが独自の実装の場合、稼働状況を確認する手段がないことがほとんどです。
ログ出力に頼るよりJMXを使った方が後々の運用でも役に立ちます。