はJava6を開くデフォルトのポートのためのJMXリモートす。
質問
具体的に質問してJMXとしての使用は、JDK1.6:ていただく場合が走るJavaプロセスの使用済みのJRE1.6と
com.sun.management.jmxremote
のコマンドラインにはJavaり、デフォルトのポートのためのリモートJMXす。
裏話:私は現在、を開発しようとしてい手続きをお客様にこの接続のプロセスによJMXからのリモートマシン。この目的は、facillitateそのリモートデバッグの事態が発生することのリアルタイムで表示です。そのサービスレベル契約で強く意欲のある捕獲として多くのデータとして可能な場合には、状況を見ても複雑なので修正し、再スターの表示コンソールすることが可能となり再接続のサーバ側です。
その走りきることができ jconsole にJDK1.6プロセス jvisualvm 後JDK1.6.7プロセスを与え物理的にアクセスできるのです。しかし、この事業運営上の必要性から、人々の問題点を強く意欲を鷲掴みにしているデータを遠隔でいるのでしょうか、走ります。
編集:知っているし、コマンドラインポート物件
com.sun.management.jmxremote.port=portNum
の問題と私は答えようとする場合は設定しないが、コマンドラインは、Javaピ他のポート遠隔モニタリング?の答えを見出さなければならないかを判定するための何か?
解決
com.sun.management.jmxremote.port=portNum
これは、セキュリティ上の理由のためだけでなく、Mr.ポテトヘッドによって与えられた理由です。したがって、それはJava 6のデフォルトを開かないように見えます。のJMX用リモートからアクセスのポートます。
編集:OPは、より多くの情報と答えを追加した後に追加されました。
。あなたが持っている別のオプションは、何らかの形ですべてのローカルJMX接続と輸出、この情報に耳を傾け、ローカルプロキシを作成することです。このように、あなたは、サーバー上の各JVMインスタンスのように魔法の設定をする必要はありません。代わりに、ローカルプロキシは、JMX経由ですべてのJVMに接続することができ、その後、何とかリモートでこの情報を公開します。私はあなたがこれを実装し、正確にどのようにポジティブではないですが、このようなものは、あなたがそうでなければJMX経由でリモートからのJVMのすべてを公開するために何をすべきかよりも少ない作業かもしれません。
他のヒント
AFAIK,
こちらはpossibilitesに接続するための JMXイプ ( 管理アプリケーション のようにjconsole,、jmxterm,mc4j,jvmstat,jmxmonitor,日本物理学会,...) JMXサーバプロセス ( 剤).
のプロトコルJMX接続クライアントとJMXサービスは、JavaのバージョンがJava RMI'(通称'RMI-JRMP').このデフォルトです。一つ設定することが可能で その他のプロトコル, 特に'RMI-IIOP"と"JMXMP'.特別プロトコルが可能です:の MX4J プロジェクト例にはさらに石鹸/HTTPや各種の直列化プロトコル上HTTP.
参照 Sun/Oracle docs の詳細を設定します。
また、ファイル jre/lib/management/management.properties
おJDK。
その可能性
0:のJVMではなく、特定の構成
前のJava6:のJVMな行動としてのJMXサーバーです。プログラム実行中のJVMにアクセスのJVMの MBeanServer プログラムを使用することができるようになります興味深いデータ交換のスレッドによJVMの監視、管理を外部からのJVM処理が可能です。
以来、Java6:なくてもexplicitely構成され、アクセスできるJMX機能のJVM 地 (同じマシン)について"に記載のとおりの場合1".
例1:JVMが始まった -Dcom.sun.management.jmxremote
のJVM構成されたとして 地 (機械)JMXサーバーです。
この場合(原則として日/Oracle JVMs)は、JMXコンサルティング/クライアント接続にはJMXサービスを通じてメモリマップファイルから /tmp/hsperfdata_[user]
.この中で言及太陽の下で文書が保存されている現地モニタリング"(ともに 添付API).で動作しない脂肪のファイルシステムとしての権限が設定できない場合は正しくあります。見 このブログ.
サ走行 jconsole
マシンのJMXサーバーとして jconsole
だという資源を独り占めで、この"現地モニタリング"ことを明らかにすることは必ずしも良い方法がありました。
現地モニタリングは、しかし、より安全、利用、簡単に制御を通じてファイルシステムのアクセス権を表します。
例2:JMXサーバ -Dcom.sun.management.jmxremote.port=[rmiregistryport]
のJVM構成されたとしてJMXサーバーの話を聞いている複数のTCPポートがあります。
のポートで指定されたコマンドラインにすることにより、JVMは、RMIレジストリはご利用できます。レジストリ広告コネクタの名前が"jmxrmi'.この点、第二に、ランダムに割り当てのTCPポートの"一時的な"ポート)のJMX RMIサーバがlistenを通じて実際のデータを交換します。
地方に記載のとおり'の場合1'が常に有効になっている"ケース2'.
JMXサーバがlistenすべてのューマンインタフェースへのデフォルトの、そして接続することができます(制御)による地域への接続127.0.0.1:[rmiregistryport]などによる遠隔接続する[なる外部のIPアドレス]:[一部のポート]います。
これまでのセキュリティに影響を及.しないように注意してくださいJVMい127.0.0.1:[rmiregistryport]みに設定 -Dcom.sun.management.jmxremote.local.only=true
.
では、残念なが指定はできませんが、一時的なポートが割り当てでは常に無作為に抽出しで起動します。このあとファイアウォールが必要となるスイスのチーズを買!しかし、あ 回避策.特に、Apache Tomcatの設定一時的なJMX RMIサーバーのポートを通じて JMXリモートライフサイクルのリスナー.このコードをこの魔法の可 org.apache.catalina.mbean.JmxRemoteLifecycleListener.
このメソッドを使用した場合まれて以下の事項を確認して下さい:
- JMXクライアントの認証はJMXサービス
- TCPとの交流のクライアントとサーバが暗号化されたSSLを利用
うことを記載してい the Sun/Oracle書
その他の手法
できな興味深い組み合わめる必要性を回避するために使用しRMIプロトコルです。特に、ビジネス地区にあるサーブレットエンジン(桟橋へいます。それがすべてのサーブレットと翻訳一部のHTTPベースの交換を内部で直接アクセスのJVMの MBeanServer
.うにするには'0'を持ってい管理能力をHTMLベースのインターフェースです。の JBoss JMXコンソール 一例です。
よりコメントは、利用SNMPを直接かんしよ この文書.
見え時間
現在では一部のコードが示されるJXMます。しら a Sunoracleチュートリアル.
この走ります。を使用していまJVM構成されたとしてJMXを使用したサーバー:
-Dcom.sun.management.jmxremote.port=9001
を使用していま lsof
確かTCPポートでは、open:
lsof -p <processid> -n | grep TCP
一見ようなことは、レジストリポートの一時的なポート:
java 1068 user 127u IPv6 125614246 TCP *:36828 (LISTEN)
java 1068 user 130u IPv6 125614248 TCP *:9001 (LISTEN)
を使用していま tcpdump
検査のことを"パケット交換JMXクライアントとJMXサービス:
tcpdump -l -XX port 36828 or port 9001
また設定ファイル .java.policy
のホームディレクトリ、お客様が実際に接続を遠隔:
grant {
permission java.net.SocketPermission
"<JMX server IP address>:1024-65535", "connect,resolve";
};
しまうこと、何が起こるか見てみてください:
package rmi;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import javax.management.remote.rmi.RMIConnection;
import javax.management.remote.rmi.RMIServer;
public class Rmi {
public static void main(String args[]) throws Exception {
// We need a Security Manager (not necessarily an RMISecurityManager)
if (System.getSecurityManager() == null) {
System.setSecurityManager(new SecurityManager());
}
//
// Define a registry (this is just about building a local data structure)
//
final int comSunManagementJmxRemotePort = 9001;
Registry registry = LocateRegistry.getRegistry("<JMX server IP address>", comSunManagementJmxRemotePort);
//
// List registry entries. The client connects (using TCP) to the server on the
// 'com.sun.management.jmxremote.port' and queries data to fill the local registry structure.
// Among others, a definition for 'jmxrmi' is obtained.
//
System.out.print("Press enter to list registry entries");
System.in.read();
String[] names = registry.list();
for (String name : names) {
System.out.println("In the registry: " + name);
}
//
// 'Looking up' the entry registered under 'jmxrmi' involves opening and tearing down
// a TCP connection to the 'com.sun.management.jmxremote.port', as well as a TCP
// connection to an ephemeral secondary port chosen at server startup.
// The actual object locally obtained is a "javax.management.remote.rmi.RMIServerImpl_Stub"
// indicating where the ephemeral port is.
// "RMIServerImpl_Stub[UnicastRef [liveRef: [endpoint:[$IP:$EPHEMERAL_PORT](remote),objID:[-62fb4c1c:131a8c709f4:-7fff, -3335792051140327600]]]]"
//
System.out.print("Press enter to get the 'jmxrmi' stub");
System.in.read();
RMIServer jmxrmiServer = (RMIServer)registry.lookup("jmxrmi");
System.out.println(jmxrmiServer.toString());
//
// Now get a "RMI Connection" to the remote. This involves setting up and tearing
// down a TCP connection to the ephemeral port.
//
System.out.print("Press enter to get the 'RMIConnection'");
System.in.read();
RMIConnection rcon = jmxrmiServer.newClient(null);
//
// Ask away. This involves setting up and tearing
// down a TCP connection to the ephemeral port.
//
System.out.print("Press enter to get the 'domains'");
System.in.read();
for (String domain : rcon.getDomains(null)) {
System.out.println("Domain: " + domain);
}
//
// Ok, that will do. For serious applications, we better use the higher-level JMX classes
//
}
}
実際にあなたがランダムなポート番号でリモートアクセス用コネクタを作成するJMXを強制するために使用できる文書化されていないプロパティがあります。
-Dcom.sun.management.jmxremote.authenticate="false"
-Dcom.sun.management.jmxremote="true"
-Dcom.sun.management.jmxremote.ssl="false"
-Dcom.sun.management.jmxremote.port="0"
-Dcom.sun.management.jmxremote.local.only="false"
最後の2つのプロパティが最も重要である。
を示しているようだのドキュメントJMXエージェントでは、次のプロパティを指定の の場合を除き、ローカル一時的なポートを使用する:
com.sun.management.jmxremote.port=portNum
あなたが一つのシステム上のの多くののJavaアプリケーションを持っている可能性があるため、デフォルトのポートが回避され、デフォルトのポートがあった場合には、一つだけのアプリケーションを管理することができるようになります!上記構成プロパティは、リモートの管理のの明確な目的のために設けられている。
あなたは一時的なポートを使用して主張しなければならない場合(これはローカルアドレスである可能性が高いが)は、その後、JMXエージェントのURLは、次のシステムプロパティを介して、JVM内からアクセスできる必要があります:
com.sun.management.jmxremote.localConnectorAddress
注:!私はあなたが常にローカルソケットに上でリモートに利用可能なアドレスとプロキシリクエストのソケットを開くことができると思いますが、利用できるオプションを使用すると、はるかに魅力的なようです。
だから、私の質問への短い答えは「ノー」です。
しかし、それはなぜ調べるのは興味深いです。有効なローカル接続からnetstat
出力を見てください。ここで私は自分自身へのローカル接続を行うjconsole
の結果として開か見ポートがあります。あなたが見ることができるように、ポート1650は、JMX情報に使用されているローカルポートがあります:
Proto Local Address Foreign Address State
TCP Gandalf:1650 Gandalf:1652 ESTABLISHED
TCP Gandalf:1650 Gandalf:1653 ESTABLISHED
TCP Gandalf:1650 Gandalf:1654 ESTABLISHED
TCP Gandalf:1650 Gandalf:1655 ESTABLISHED
TCP Gandalf:1650 Gandalf:1656 ESTABLISHED
TCP Gandalf:1652 Gandalf:1650 ESTABLISHED
TCP Gandalf:1653 Gandalf:1650 ESTABLISHED
TCP Gandalf:1654 Gandalf:1650 ESTABLISHED
TCP Gandalf:1655 Gandalf:1650 ESTABLISHED
TCP Gandalf:1656 Gandalf:1650 ESTABLISHED
しかし、それはjconsole
にlocalhost:1650
を接続しようとするのに十分ではありません。悲しいことに、あなたをネットしますそのすべてが「失敗した接続は:テーブルにはそのようなオブジェクト」ではありません。メッセージ
だから、私のオリジナルストーリーの結論は、我々の顧客のためにJMXを使用してリモート監視を容易しようとしているならば、私たちは本当に私たちのシステムで起動しているJavaプロセスのさまざまなユニークな個々のリモートアクセスポートを特定する必要がある、ということです。幸いなことに、このすべてが必要ですが、VM引数の賢明な使用である。
com.sun.management.jmxremote.port=portNum
顧客は、ポート番号を使用して、正しいリモートアプリケーションを選択することができるように、我々はほぼ確実portNum
の順次事前に指定した範囲を持つことになります。
私は設定の特殊な性質で開始されたとJVMを必要とせずに、JavaコードからリモートJMX管理を有効にする方法を見つけ出すために、最近取り組んできました。簡単に十分な - - とそのレジストリにJMXサービスを公開するために、私は上の和解解決策は自分のプライベートRMIレジストリを開始することです。私は自分のMBeanServerを作成し、その後、新しいJMXConnectorServerを作成します。 JMXConnectorServerは、
のような呼び出しによって作成されますconnector = JXMConnectorServerFactory.newJMXConnectorServer(url, null, server);
どこにサーバがMBeanServerのある、そしてurlはたJMXServiceURLのインスタンスである。
URLの形式は、 "サービス:JMX:RMI:/// JNDI / RMI:// localhostを:/ jmxrmi" ポート(ローカル)プライベートレジストリのポート番号です。 「jmxrmiは、」JMXサービスのための標準的なサービス名です。
この設定、およびコネクタを開始した後、私は、ホスト名使用してjconsoleをからに接続できることを見つける:ポートを
これは完全に私のニーズに対応します。私は、誰もが、このアプローチで欠陥を見れば知って興味があるだろう。
参考: JMXチュートリアル、章。 3 の
、あなたは、変更を有効にするために、実行中のすべてのサーバーを再起動する必要があります。
./のasadmin有効安全管理者
さらにセキュリティを有効にするために、余分なGlassfishのサーバ構成は、でより多くのJMXを通じてGlassfishのにリモート接続を参照してくださいありますが、 のます。