CLOVER🍀

That was when it all began.

JMXでのリモート接続でハマったこと

最近、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

うー、勉強になりました…。