JMX:Java Management Extentionsを習得するためには
JBossやTomcatはもちろんのこと,聞いた話ではWebLogicなどの商用プロダクトでも現在はJMXを使ってカーネルを実装しているらしい.
JBossだとかTomcatだとかの内部を勉強しようとすると大きな壁となるのがこのJMXというやつ.Javaベースのサーバのカーネルのソースコードでも読もうとしない限りまず間違いなくJava開発者との接点がないこのAPIは,Javaの数あるAPIの中でももっとも抽象度の高いAPIであるため理解しにくい.
またJMXを使った簡単なカーネル実装とかがそのへんに転がっていればまだ分かりやすいのだろうが,JMXを使ったカーネル実装例といえばモロJBossやTomcatという話になるためハードルが非常に高いのだと思う.
私もJMXに関してはネットで見つけた幾つかの概要解説記事などを最初読んでみたが,やはりそれだけでJBossのJMXカーネルを読み解くことは無理だった.既に理解している今となってはあのJMXのアーキテクチャを図にしたものは良く分かるのだが,あの図とその説明だけを見た人にとってはどのようなソースコードと意味的にリンクするのかは分かるまい.
JBossの場合は先日,日本のユーザメーリングリストで上手く設定が行かないとエラーメッセージを投稿していた方がいたが,ああいうエラーメッセージに含まれるMBean関連のエラー情報なども,やはりJMXおよびJMXカーネルというやつを理解していない人にとっては正確な意味がわからないという状態だろう.
まあ実際,以前の私がまさにそうだったのだから.
前置きが長くなったが.JMXはJNDIを既に理解している人にとってはもしかすると少し分かりやすいかもしれない.LDAPのJavaラッパーという意味のJNDIではなく,EJBで使用されているようなオブジェクトの登録(bind)と取得(lookup)という意味のJNDIについてだ.
これはJNDIのSPI側でいうRMI Registryを指している.もしRMI Registryについて何も知らなければ,JMXについて学び始める前に先にこれを学ぶことをおすすめする."JavaでHello World"さんの「RMIやってみました」系記事とかが参考になるかもしれない.
さて,そんなJNDIとJMXだが,以下の点で共通していると私は思う.
- オブジェクトを登録する人,登録されたオブジェクトを管理する人,オブジェクトを検索して取得する人の3者が想定されていること
- この「オブジェクトを管理する人」が間にサービスとして入ることで他の2人を疎結合にし,システム全体の柔軟性を高めていること
- オブジェクトの登録に際して,取得用のキーが指定されるが,そのキーは任意の文字列であること(正確にはJMXではObjectNameというオブジェクトがキーだがこのObjectNameのコンストラクタに任意の文字列を与えているので)
とりあえずこのように考えれば,JMXもちょっとは身近になるかもしれない.
JMXでは登録されるオブジェクトはMBeanと呼ばれる.ManagedBeanの略だ.そしてMBeanを管理するのがMBeanServer.
RMI RegistryとMBeanServerは上に挙げた点で共通しているということ.JMXというのはMBeanServerが先ほど書いた2人の疎結合をさらに強力に推し進めているのと,RMI Registryに無いような豊富な機能が追加されている,というだけのことだ.
それさえ分かってしまえば,あとは何てことはない.形式になれるだけでJBossのソースコードも読めるようになる.
どこかのコードがMBeanServerから名前を指定してMBeanを取得していたとすれば,それはそれ以前に実行された別のどこかのコードがその名前でMBeanをMBeanServerに登録していたというだけのことだ.
と書いてみたが,人の話を聞くだけではやっぱり理解しにくいかもしれない.4年前に出版された本だが,おすすめの本が1冊ある.日本のAmazonで手に入るようだ.
JMX Managing J2EE With Java Management Extensions
http://www.amazon.co.jp/exec/obidos/ASIN/0672322889/qid=1119396499/sr=1-2/ref=sr_1_2_2/249-9373475-9580312
この本を通勤電車とかでゆっくり時間をかけて読めば,いつのまにかJMXが分かるようになる.JMXが分かれば,あとは力押しである程度はJMXカーネルが読めるようになる.そこから先は読みながらそのプロダクトのアーキテクチャを学んでいけば,一気に理解するスピードも上がる.