HtmlAdaptorServerの謎

はてなの趣旨を尊重して,他人の役に立ちそうなことも少しは書いておいてあげよう

最近JMXで遊んでいる

最初に作ったのが,外部からシャットダウンコマンドを呼び出して,サーバーを停止させるという基本中の基本みたいな代物である

ところがこれを完成させるのに1週間もかかってしまった.

書いたプログラムは単純なもので

  1. stopメソッドだけを実装したMBeanインターフェースをつくりサーバー(といっても数数えるだけというスレッドの使い方のサンプルみたいな)に実装
  2. このbeanとHtmlAdaptorServerのBeanをMBeanServerに登録
  3. stopコマンドが来たらサーバー終了


これだけである.

ところがこれが終了しないのだ.
現象としては自家製のサーバーの方はちゃんと死んでくれるのだが,HtmlAdaptorServerのbeanが死んでくんないのである.これではシャットダウンコマンドの意味がない


ちょっと解説するとこのHtmlAdaptorServerはSunのJMXのリファレンス実装についてくるやつで,MBeanServerに登録してやると同じMBeanServerに登録された他のBeanにWeb経由でアクセス可能になるという優れものである.当然My serverのstopメソッドの起動もこれ経由で行っている.

このHtmlAdaptorServerをぶち殺すやり方がまったく不明で,1週間試行錯誤するはめになった.一応言っておくが,1週間こればかりやっていたわけではないぞ(笑)仕事の合間の切れ端な時間にやったことだ.

このテストプログラム(StdTest)を起動して終了させる手順は以下の通りである.

  1. Eclipseから,前回の起動をデバッグで立ち上げ
  2. ブラウザからhttp://localhost:8082/にアクセス
  3. AgentViewのページが出るので,MBeanのStdTestのところをクリック
  4. StdTestのBeanViewのページが出るので,一番下にあるstopボタンを押す
  5. Eclipseデバッグ画面を見ると死んでない(泣)

このHtmlAdaptorServerをぶち殺す方法が発見されたのは全くの偶然からであった

4のstopボタンを押すと「Stop successful」という,コマンドの実行が成功しました的なnoticeページに遷移するのだが,このページを表示しているブラウザをクローズするか,他のページにジャンプするとHtmlAdaptorServerは死んでくれるのであった.逆にいうとどういう仕組みになっているのか知らんが,このページがブラウザに表示されている限りは本体のアプリケーションが死のうが,MBeanServerからUnregisterされようが,HtmlAdaptorServerのBeanの変数にnullを代入しようが,ゾンビのごとく生きつづけているのであった.で当然私が頭抱えて見ているEclipseデバッグ画面の脇ではブラウザがStop successfulのページを表示しっぱなしなわけですな.はあ.

まったく迷惑な野郎だ

この記事は役に立ちましたか?[Y/N]