JMX を業務で触れたため、改めて調べたのでメモ。
とりあえず SpringBoot で動かす
JMX に接続するためのクライアントに jconsole というツールがあります。Stackoverflow で "What is the best or most commonly used JMX Console" という質問を見ても jconsole が最も人気のようです。jconsole は JDK と一緒にインストールされるようなので、多くの環境ですぐに使えるのも良いのかもしれません。
試しに jconsole コマンドを打ってみます:
$ jconsole --help
おもむろに GUI が立ち上がり、ヘルプメッセージが表示されました。PID を直接渡したり、ホスト:ポートのペアを渡したりできるようです。今回は SpringBoot の適当なアプリケーションを立ち上げて、その PID に接続してみることにします:
$ jconsole 14336 # 私の環境のアプリケーションの PID です
何やら出ますが気にしないで接続(リモートだと SSL を使って通信できるようです)
これで jconsole が立ち上がり、Java アプリケーションの JMX に接続ができました。リモート環境であれば SpringBoot の起動オプションに JMX を有効にする設定と JMX 用のポートを指定すれば、ローカルの jconsole を使って、リモート環境の JMX にアクセスが可能でした。
これでリモートアプリケーションのリソース状況が知れたり、スレッドダンプが見れるだけでも十分便利なのですが、一番右タブの「MBean」が見慣れません。
MBean とは?
MBeanはJava Virtual Machine上で走るリソース(アプリケーションやJava EE技術サービス(トランザクション・モニタやJDBCドライバなど))との連絡窓口の役割を果たす。MBeanは、関心のある統計数値(パフォーマンス、リソース使用量、問題など)を収集すること(プル)、アプリケーションの設定値を取得または設定すること(プッシュ/プル)、および障害や状態変化などのイベントを通知すること(プッシュ)に使える。
やはり Wikipedia だとよく分かりません… いくつかのブログや文献を見ると、特定の記法に従うクラス(bean)に対して、JMX を通じて情報を取得したり、アクションを与えることができる機構のようです。
通常は **MBean
と名前の付いたインタフェースを用意し、それを実装した具象クラスを MBean Server に登録する…という流れのようです。SpringBoot では便利なアノテーションが用意されているため、試しに適当につけてみます:
@SpringBootApplication @ManagedResource(objectName = "MyApp:name=MyMbean") public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } @ManagedOperation(description = "Returns something.") public String getSomething() { return "Something"; } }
参考ブログ:MBeans using spring and annotations
@ManagedResource(objectName = "MyApp:name=MyMbean")
と、@ManagedOperation(description = "Returns something.")
のアノテーションを付けた getSomething
メソッドを追加しています。この状態で jconsole を開き、MBean のタブに行くと、MyApp が登録されているのが分かります:
getSomething
ボタンを押すと、返り値の Something
が帰ってきます:
MBean には他にも、イベントに応じて通知を送信したり、他の MBean の状況を定期的にポーリングするなどの設定もできるようです。JMX を理解したとはまだ到底言えませんが、思ったよりずっと気軽に使える技術であると分かっただけでも収穫でした。