Standardmäßig ist JMX automatisch lokal zugreifbar, so dass jconsole
lokal alle Ihre lokalen Java-Anwendungen ohne Port-Exposition erkennen würde.
Um über JMX Remote auf eine App zuzugreifen, müssen Sie einen RMI-Registry-Port angeben. Die Sache zu wissen ist, dass beim Verbinden, JMX initialisiert an diesem Port und dann stellt eine Datenverbindung zurück auf einem Random High Port, die ein großes Problem ist, wenn Sie eine Firewall in der Mitte haben. ("Hey sysadmins, öffne einfach alles, mkay?").
JMX Um zu erzwingen, auf dem gleichen Port zu verbinden zurück, wie Sie festgestellt haben, haben Sie ein paar Optionen:
Option 1: Befehlszeile
-Dcom.sun.management.jmxremote.port=$JMX_REGISTRY_PORT
-Dcom.sun.management.jmxremote.rmi.port=$RMI_SERVER_PORT
Wenn Sie Frühling verwenden Boot können Sie dies in Ihre (appname).conf
Datei, die neben Ihrer (appname).jar
Bereitstellung lebt.
Option 2: Tomcat/Tomee Konfiguration
Konfigurieren eines JmxRemoteLifecycleListener:
Maven Jar:
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-catalina-jmx-remote</artifactId>
<version>8.5.9</version>
<type>jar</type>
</dependency>
dem Server konfigurieren.xml:
<Listener className="org.apache.catalina.mbeans.JmxRemoteLifecycleListener"
rmiRegistryPortPlatform="10001" rmiServerPortPlatform="10002" />
Option 3: konfigurieren programmatisch
@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;
}
}
Der Trick, werden Sie sehen, ist die serviceUrl
, in dem Sie sowohl die JMX angeben: rmi Host/Port und die jndi: rmi Host/Port. Wenn Sie beide angeben, erhalten Sie nicht das zufällige hohe "Problem".
Schließt dieser Ansatz die Verwendung der 'JAVA_OPTS'-Methode aus? – raffian