JMXポート
1. 概要
このチュートリアルでは、JMXが起動時に3つのポートを開く理由を説明します。 さらに、JavaでJMXを起動する方法を示します。 その後、開くポートの数を制限する方法を示します。
2. JMXの定義
まず、JMXフレームワークとは何かを定義しましょう。 Java Management Extensions(JMX)フレームワークは、Javaアプリケーションを管理するための構成可能で、スケーラブルで、信頼性の高いインフラストラクチャを提供します。 さらに、アプリケーションをリアルタイムで管理するためのMBeanの概念を定義します。 フレームワークを使用すると、アプリケーションをローカルまたはリモートで管理できます。
3. JavaでJMXを有効にする
次に、JMXを有効にする方法を見てみましょう。 Javaバージョン1.5以前の場合、システムプロパティがあります
ただし、Java 6以降では、パラメータは不要です。 アプリケーションは、起動後に自動的に管理できるようになります。 さらに、デフォルト構成ではポートが自動的に割り当てられ、ローカルでのみ公開されます。
4. JMXポート
この例では、Java6以降を使用します。 まず、無限ループのクラスを作成しましょう。 クラスは何もしていませんが、開いているポートを確認できます。
public class JMXConfiguration {
public static void main(String[] args) {
while (true) {
// to ensure application does not terminate
}
}
}
次に、クラスをコンパイルして開始します。
java com.baeldung.jmx.JMXConfiguration
その後、プロセスに割り当てられているpidを確認し、プロセスによって開かれたポートを確認できます。
netstat -ao | grep <pid>
その結果、アプリケーションによって公開されているポートのリストが表示されます。
Active Connections
Proto Local Address Foreign Address State PID
TCP 127.0.0.1:55846 wujek:55845 ESTABLISHED 2604
また、再起動の場合、ポートが変更されます。 ランダムに割り当てられます。 この機能は、JavaAttachAPIのアプリケーションを自動的に公開するJava6以降で使用可能になっています。 つまり、ローカルプロセスを介したJConsole接続用のアプリケーションを自動的に公開します。
次に、JVMにオプションを提供して、リモート接続を有効にします。
-Dcom.sun.management.jmxremote=true
-Dcom.sun.management.jmxremote.port=1234
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
ポート番号は、リモート接続用にJMXを公開するために提供する必要のある必須パラメーターです。 テスト目的でのみ認証とSSLを無効にしました。
ここで、netstatコマンドは次を返します。
Proto Local Address Foreign Address State PID
TCP 0.0.0.0:1234 wujek:0 LISTENING 11088
TCP 0.0.0.0:58738 wujek:0 LISTENING 11088
TCP 0.0.0.0:58739 wujek:0 LISTENING 11088
ご覧のとおり、アプリケーションは3つのポートを公開しました。 RMI/JMXは2つのポートを公開します。 3つ目は、ローカル接続用のランダムポートです。
5. 開くポートの数を制限する
まず、 -XX:+ DisableAttachMechanism オプションを使用して、JConsoleからのローカル接続用のアプリケーションの公開を無効にできます。
java -XX:+DisableAttachMechanism com.baeldung.jmx.JMXConfiguration
その後、アプリケーションはJMX/RMIポートを公開しません。
さらに、JDK 16から、ローカルポート番号を設定できます。
java
-Dcom.sun.management.jmxremote=true
-Dcom.sun.management.jmxremote.local.port=1235
com.baeldung.jmx.JMXConfiguration
次に、構成を変更して、リモートポートを試してみましょう。
追加のオプション-Dcom.sun.management.jmxremote.rmi.port=1234 があり、RMIポートをJMXポートと同じ値に設定できます。 現在、完全なコマンドは次のとおりです。
java
-Dcom.sun.management.jmxremote=true
-Dcom.sun.management.jmxremote.port=1234
-Dcom.sun.management.jmxremote.rmi.port=1234
-Dcom.sun.management.jmxremote.local.port=1235
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
com.baeldung.jmx.JMXConfiguration
その後、netstatコマンドは次を返します。
Proto Local Address Foreign Address State PID
TCP 0.0.0.0:1234 wujek:0 LISTENING 19504
TCP 0.0.0.0:1235 wujek:0 LISTENING 19504
つまり、アプリケーションは2つのポートのみを公開します。1つはJMX / RMIリモート接続用で、もう1つはローカル接続用です。 そのおかげで、公開されたポートを完全に制御し、他のプロセスによって公開されたポートとの競合を回避できます。
ただし、リモートからの接続を有効にし、接続メカニズムを無効にすると、次のようになります。
java
-XX:+DisableAttachMechanism
-Dcom.sun.management.jmxremote=true
-Dcom.sun.management.jmxremote.port=1234
-Dcom.sun.management.jmxremote.rmi.port=1234
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
com.baeldung.jmx.JMXConfiguration
その後、アプリケーションは引き続き2つのポートを公開します。
Proto Local Address Foreign Address State PID
TCP 0.0.0.0:1234 wujek:0 LISTENING 9856
TCP 0.0.0.0:60565 wujek:0 LISTENING 9856
6. 結論
この短い記事では、JavaでJMXを起動する方法について説明しました。 次に、起動時にJMXによって開かれるポートを示しました。 最後に、JMXによって開かれるポートの数を制限する方法を示しました。
いつものように、例のソースコードはGitHubでから入手できます。