春は自動的にJMX Beanを公開することを知っています。 VisualVMを使用してローカルにアクセスできました。
しかし、どのようにJMX Beanを使用してアプリにリモートで接続できますか?デフォルトのポートはありますか、それとも何か定義する必要がありますか?
ありがとう、レイ。
デフォルトでは、JMXはローカルで自動的にアクセスできるため、jconsole
locallyを実行すると、ポートを公開せずにすべてのローカルJavaアプリを検出します。
JMXremotely経由でアプリにアクセスするには、RMIレジストリポートを指定する必要があります。知っておくべきことは、接続すると、JMXはそのポートで初期化し、thenがデータ接続を確立することですランダムな高ポートに戻ります。これは、ファイアウォールが中央にある場合には大きな問題です。 (「システム管理者、すべてを開いてください、ねえ」)。
確立したのと同じポートにJMXを強制的に接続し直すには、いくつかのオプションがあります。
オプション1:コマンドライン
-Dcom.Sun.management.jmxremote.port=$JMX_REGISTRY_PORT
-Dcom.Sun.management.jmxremote.rmi.port=$RMI_SERVER_PORT
Spring Bootを使用している場合、これを(appname).conf
あなたの(appname).jar
展開。
オプション2:Tomcat/Tomeeの構成
JmxRemoteLifecycleListener を構成します:
メイヴンジャー:
<dependency>
<groupId>org.Apache.Tomcat</groupId>
<artifactId>Tomcat-catalina-jmx-remote</artifactId>
<version>8.5.9</version>
<type>jar</type>
</dependency>
Server.xmlを構成します。
<Listener className="org.Apache.catalina.mbeans.JmxRemoteLifecycleListener"
rmiRegistryPortPlatform="10001" rmiServerPortPlatform="10002" />
オプション3:プログラムで構成する
@Configuration
public class ConfigureRMI {
@Value("${jmx.rmi.Host:localhost}")
private String rmiHost;
@Value("${jmx.rmi.port:1099}")
private Integer rmiPort;
@Bean
public RmiRegistryFactoryBean rmiRegistry() {
final RmiRegistryFactoryBean rmiRegistryFactoryBean = new RmiRegistryFactoryBean();
rmiRegistryFactoryBean.setPort(rmiPort);
rmiRegistryFactoryBean.setAlwaysCreate(true);
return rmiRegistryFactoryBean;
}
@Bean
@DependsOn("rmiRegistry")
public ConnectorServerFactoryBean connectorServerFactoryBean() throws Exception {
final ConnectorServerFactoryBean connectorServerFactoryBean = new ConnectorServerFactoryBean();
connectorServerFactoryBean.setObjectName("connector:name=rmi");
connectorServerFactoryBean.setServiceUrl(String.format("service:jmx:rmi://%s:%s/jndi/rmi://%s:%s/jmxrmi", rmiHost, rmiPort, rmiHost, rmiPort));
return connectorServerFactoryBean;
}
}
あなたが見るトリックは、jmx:rmiホスト/ポートとjndi:rmiホスト/ポートの両方を指定するserviceUrl
です。両方を指定すると、ランダムな高い「問題」は発生しません。
(アプリケーション内の)「$ Java_OPTS」に次のJVMプロパティを追加します。
-Dcom.Sun.management.jmxremote -Dcom.Sun.management.jmxremote.port=<PORT_NUMBER> -Dcom.Sun.management.jmxremote.authenticate=false -Dcom.Sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname=<Host'S_IP>
Jconsole/Visual VMでは、次を使用して接続します。
service:jmx:rmi:///jndi/rmi://<Host'S_IP>:<PORT_NUMBER>/jmxrmi
セキュリティは有効になりませんが、リモートサーバーへの接続に役立ちます。
Java 1.8.0_71およびSpring Boot(1.3.3.RELEASE)でテスト済みのアプローチ。監視対象JVMのJVM引数に以下のパラメーターを追加します。
-Dcom.Sun.management.jmxremote -Dcom.Sun.management.jmxremote.port=12348 -Dcom.Sun.management.jmxremote.authenticate=true -Dcom.Sun.management.jmxremote.ssl=false -Dcom.Sun.management.jmxremote.rmi.port=12349 -Dcom.Sun.management.jmxremote.password.file=/somewhere/jmxremote.password -Dcom.Sun.management.jmxremote.access.file=/somewhere/jmx/jmxremote.access
com.Sun.management.jmxremote.port
は固定RMIレジストリポートの定義に使用され、com.Sun.management.jmxremote.rmi.port
は固定RMIポートを使用するようJVMに指示するために使用されますが、ランダムなポートは使用しません。
これを設定することにより、12348および12349ポートを開くファイアウォールを介して、JVMクライアントをリモートホストから監視対象のJVMに接続できます。
以下の出力を生成するリモートマシンでJava -jar cmdline-jmxclient-0.10.3.jar user:pwd hostip:12348
を使用してテストしました(デモのために短縮されています)。
Java.lang:type=Runtime
Java.lang:name=PS Scavenge,type=GarbageCollector
Tomcat:J2EEApplication=none,J2EEServer=none,WebModule=//localhost/,j2eeType=Filter,name=requestContextFilter
Java.nio:name=mapped,type=BufferPool
Tomcat:Host=localhost,type=Host
Java.lang:name=Compressed Class Space,type=MemoryPool
.......
Jarは Here からダウンロードされます。