- - PR -
プラットフォームMBeanサーバのマニュアル起動
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2007-02-08 13:22
Sun Java SE 6ベースで開発しています。
JVM起動時にプラットフォームMBeanサーバを自動起動し、指定ポート経由でのアクセスを許可するためには、(最低限)以下のJVM起動オプションが必要です。 -Dcom.sun.management.jmxremote=true -Dcom.sun.management.jmxremote.port=<ポート番号> さて、このポート番号をJVM起動後に決定したいのですが、それは可能でしょうか? つまり自動起動は行わず、プログラム内でポート番号決定後にプラットフォームMBeanサーバをマニュアル起動したいのです。 試しに-Dcom.sun.management.jmxremote=falseで起動し、以下のようなコードを実行してみましたが指定ポートでのリスンは始まりませんでした。 System.setProperty("com.sun.management.jmxremote.port=<ポート番号>"); ManagementFactory.getPlatformMBeanServer(); 何かヒントなどあれば、ぜひ教えてください。よろしくお願いします。 | ||||||||
|
投稿日時: 2007-02-08 15:01
こんにちは、さくらばです。
ManagementFactory.getPlatformMBeanServer で取得した MBeanServer は通信の ための設定はしてありません。通信を行うためには MBeanServer に Connector を追加します。
ただし、これだけだと RMI で通信できないので、別途 rmiregistry を指定のポート で立ち上げておく必要があります。プログラムの中で rmiregistry を起動すること もできます。 プログラムが起動した後に、JMX をプログラムの外部から起動させたいので あれば、Attach API が使えます。 http://itpro.nikkeibp.co.jp/article/COLUMN/20061208/256374/?ST=develop | ||||||||
|
投稿日時: 2007-02-08 16:49
さくらばさん
ご回答、どうもありがとうございます。 おかげさまでrmiregistryを別途起動する方法で、ひとまずプログラムからリスンを開始することができました。
さて、今度はrmiregistryの起動に挑戦してみますが、一点だけ確認させて下さい。 これは今回Connectorを追加したプログラムの中で、事前にrmiregistryを起動しておくという理解で正しいのでしょうか? 参照先URLの以下の記述を読むと、マネージャ(jconsole)側で起動しているようにも受け取れるのですが・・・。
| ||||||||
|
投稿日時: 2007-02-08 17:20
さくらばさんにいただいたヒントを元に、sun.management.Agentクラスのソースを追ったら、あっさりできてしまいました。
これだけです。まあ、思いっきりSunのJVMに依存しているわけですが、運良くサポートしないといけないOSはLinux/Windows/Solarisだけなのです。 さくらばさん、本当にどうもありがとうございました。 | ||||||||
|
投稿日時: 2007-02-08 17:47
補足です。
当たり前と言えば当たり前なのですが、プラットフォームMBeanサーバーは二重起動ができません。 なので、先述の方法でプラットフォームMBeanサーバーを起動する際は、Java起動オプションに"-Dcom.sun.management.jmxremote"を指定してはいけません。trueでもfalseでもダメで、無指定が正解です。 以上、ご参考まで。(こんなことやる人はそうそういないと思いますが・・・) | ||||||||
|
投稿日時: 2007-02-09 01:28
プログラムからrmiregistryを起動するには、
java.rmi.registry.LocateRegistry#getRegistry()でできますよ。 既に同じポートで動いていたら怒られると思いましたが。 古い記憶で申し訳ないですが・・・ わたしもカーニーさんと同じようなプログラムを作っていますよ。 分散環境でTomcat5.5を使っているのですが、 マネージャアプリの代わりにJConsoleで管理できるようにしています。 (極限まで機能を削ぎ落としたTomcatにしている) サーブレットの中でPlatformMBeanServerを取得すると、 Tomcatの管理アプリで操作可能な情報がJConsoleに現れます。 なので、コネクタサーバ+rmiregistryで外部から管理できるようにしています。 そして割と重要なんですが、待ち受けのJMXServiceURLをログにダンプして、 いざ待ち受けのURLがわからない、ということがないようにしています。 MBeanって結構便利なのですが、意外と使われていませんね。 簡単にリモート処理ができるフレームワークと割り切ると、 これほど楽なものはないのでは?と思います。 そういやシェルで対話式で管理できるクライアントってないのでしょうかね。 | ||||||||
|
投稿日時: 2007-02-09 02:16
こんばんは。
ご参考までに、自分は以下のようなやり方をしています。
と書いているうちに、かつのりさんとかぶってしまいましたか…(^^;)
同感です。 C/S 構成の簡単なアプリを組む時に使ってみたのですが、自分で通信やソケット周りの部分をごりごり書かなくて済むのですごく楽でした。 | ||||||||
|
投稿日時: 2007-02-13 11:58
かつのりさん、Jauneさん
情報どうもありがとうございます。週末を挟んでお礼が遅くなってしまいました。 教えていただいた方法は標準APIですからとてもよいですね。 やってみたところ問題なくできました。 が、プログラムが停止しない・・・・・non-daemonスレッドがあがってしまったからかな? 追って報告します。 |