質問

具体的に質問して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ピ他のポート遠隔モニタリング?の答えを見出さなければならないかを判定するための何か?

役に立ちましたか?

解決

JMXことを示唆しているの

ドキュメント

:あなたは次のプロパティを指定しない限り - マシンの外部から到達できない何か - エージェントは、をローカルのポートを使用しています

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.

このメソッドを使用した場合まれて以下の事項を確認して下さい:

  1. JMXクライアントの認証はJMXサービス
  2. 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つのプロパティが最も重要である。

だから、私の質問への短い答えは「ノー」です。

しかし、それはなぜ調べるのは興味深いです。有効なローカル接続から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

しかし、それはjconsolelocalhost:1650を接続しようとするのに十分ではありません。悲しいことに、あなたをネットしますそのすべてが「失敗した接続は:テーブルにはそのようなオブジェクト」ではありません。メッセージ

だから、私のオリジナルストーリーの結論は、我々の顧客のためにJMXを使用してリモート監視を容易しようとしているならば、私たちは本当に私たちのシステムで起動しているJavaプロセスのさまざまなユニークな個々のリモートアクセスポートを特定する必要がある、ということです。幸いなことに、このすべてが必要ですが、VM引数の賢明な使用である。

com.sun.management.jmxremote.port=portNum

顧客は、ポート番号を使用して、正しいリモートアプリケーションを選択することができるように、我々はほぼ確実portNumの順次事前に指定した範囲を持つことになります。

あなたは、単に次のasadminコマンドを実行して、GlassFishアプリケーションサーバー内でアプリケーションを実行するために起こる場合は、

、あなたは、変更を有効にするために、実行中のすべてのサーバーを再起動する必要があります。

./のasadmin有効安全管理者

さらにセキュリティを有効にするために、余分なGlassfishのサーバ構成は、でより多くのJMXを通じてGlassfishのにリモート接続を参照してくださいありますが、 のます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top