最近、JMXのリモート接続を使おうとしてハマりまして。
調べたら、一応解決しましたが、普通にハマりどころだった…?
それぞれハマったのは違う場面なのですが、以下の2つのことが理由でJMXのリモート接続に苦戦したという話。
毎度おなじみ、このあたりのオプションは指定している前提です。
-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=[ポート] -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false
今は、「com.sun.management.jmxremote」は要らないのかな?
Linuxで、「hostname -i」がローカルアドレス以外を返すようになっていること
Linuxで「hostname -i」が127.0.0.1を返すようになっていると、うまく接続できないらしいです。
https://docs.oracle.com/javase/jp/6/technotes/guides/management/faq.html#linux1
こういう時は、hostsファイルを編集しましょう、と。
参考)
http://techblog.hilife-jp.info/2012/12/jmx-java-monitoring/
http://d.hatena.ne.jp/tubureteru/20100829/p3
ファイアーウォールを越えて接続できない
JMXでの接続対象に、起動時に「com.sun.management.jmxremote.port」でRMI Registryが接続可能なポートを指定すると思うのですが、実は使うポートはこれだけではないという話。
これを知らなくて、ファイアーウォール越しに繋ごうとした時にハマりました。
RMI Serverが利用するポートが、もうひとつ必要らしいですね。
com.sun.management.jmxremote.port 管理プロパティーにより RMI Registry が接続可能なポートが指定されますが、RMIServer および RMIConnection リモートオブジェクトがエクスポートされるポートは、RMI スタックにより選択されます。
https://docs.oracle.com/javase/jp/7/technotes/guides/management/agent.html
しかも、このポートは勝手に決まるし、固定したい場合は自分でコードでエクスポートしてね、的な…。
おお、これは困った…。
と思いきや、JDK 7 update4からこのポートが指定できるようになったらしいです。
-Dcom.sun.management.jmxremote.rmi.port=[ポート]
ここで指定するポートは、「com.sun.management.jmxremote.port」と一緒でも大丈夫でした(つまり、JMXのために必要なポートはひとつでもOK)。
参考)
http://realjenius.com/2012/11/21/java7-jmx-tunneling-freedom/
http://pineapplesoftware.blogspot.jp/2012/11/this-post-is-basically-commercial-for.html
http://lake-michigan.hatenablog.com/entry/20130614/1371176221
うー、勉強になりました…。