2009-08-12 12 views
55

Ich versuche, mit jConsole eine Verbindung zu einer Remote-Tomcat-JMX-Instanz herzustellen. Kann aber keine Verbindung herstellen. Irgendeine Idee?Remote-Tomcat-JMX-Instanz mit jConsole verbinden

I enthalten die folgende Option in Remote-tomcat catalina.sh: "Aber kann nicht erfolgreich verbinden"

JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote \ 
    -Dcom.sun.management.jmxremote.port=9004 \ 
    -Dcom.sun.management.jmxremote.ssl=false \ 
    -Dcom.sun.management.jmxremote.authenticate=false" 
+0

Sie sind eine verpackte Version von Tomcat ausgeführt wird oder Sie haben installieren es manuell? Noch eine Sache, können Sie den vollständigen Fehler einfügen? –

+0

Ähnliche Fragen: https://stackoverflow.com/questions/151238/has-anyone-ever-got-a-remote-jmx-jconsole-to-work – Vadzim

Antwort

2

Was genau meinen Sie, wenn Sie sagen? Gibt es eine Fehlermeldung? Versuchen Sie, jconsole einzuloggen und sehen Sie, ob das hilft, es zu debuggen.

auf jconsole Protokollierung aktivieren, bearbeiten Sie jconsole eine Datei mit dem Namen logging.properties in dem Verzeichnis, in ausgeführt werden soll, fügen:

handlers= java.util.logging.ConsoleHandler 

.level=INFO 

java.util.logging.FileHandler.pattern = %h/java%u.log 
java.util.logging.FileHandler.limit = 50000 
java.util.logging.FileHandler.count = 1 
java.util.logging.FileHandler.formatter = java.util.logging.XMLFormatter 

java.util.logging.ConsoleHandler.level = FINEST 
java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter 

javax.management.level=FINEST 
javax.management.remote.level=FINEST 

Dann beginnen jconsole mit:

jconsole -J-Djava.util.logging.config.file=logging.properties 
+0

Joe, ich bekomme die folgende Ausnahme. Das Ignorieren Protokollierung Fehler deuten darauf hin, was ist das Problem \t bei com.sun.jmx.remote.util.ClassLogger.finer (ClassLogger.java:130) \t bei com.sun.jmx.remote.util.ClassLogger.trace (ClassLogger. java: 88) \t bei javax.management.remote.rmi.RMIConnector.connect (RMIConnector.java:245) \t bei javax.management.remote.rmi.RMIConnector.connect (RMIConnector.java:227) \t bei Sonne .tools.jconsole.ProxyClient.tryConnect (ProxyClient.java:334) \t bei sun.tools.jconsole.ProxyClient.connect (ProxyClient.java:296) \t bei sun.tools.jconsole.VMPanel $ 2.run (VMPanel. Java: 280) – Niger

+0

Sorr y, ich hatte einen Tippfehler im logging.properties-Text. Ich habe meinen Beitrag bearbeitet, habe versucht, diese Datei erneut zu erstellen und nachzusehen, ob Sie Informationen zum Debuggen erhalten. –

+0

Nein, wir können die Protokolle nicht sehen. Wo erstellt das die Protokolle? –

63

I hatte ein ähnliches, wenn nicht das gleiche Problem. Ich könnte eine Verbindung zum JMX-Server herstellen, wenn ich jconsole lokal auf dem Rechner gestartet habe.

Es scheint, dass der RMI-Server nicht auf die richtige IP-Adresse abhört. So, wie in this related question vorgeschlagen wurde, habe ich die folgenden:

-Djava.rmi.server.hostname=<host ip> 

zu JAVA_OPTS als gut, und dann hat es funktioniert.

+0

Vielen Dank. Das habe ich gebraucht. – Conor

+1

Arbeitete für mich Ich habe nur die Host-IP auf 127.0.0.1 und es funktionierte für mich auf meinem lokalen Rechner. – rado

+0

Fügen wir dies dem JAVA_OPTS des Servers oder der lokalen Maschine JAVA_OPTS hinzu? –

8

Welche Zeichenfolge verwenden Sie als JMX-Verbindungs-URL? Ich möchte nicht auf das Offensichtliche hinweisen, aber JConsole hat eine schreckliche Schnittstelle und für mich ist eine übermäßig komplexe URL erforderlich, bevor eine Verbindung zu einer Remote-Jmx-App hergestellt wird. Mine sieht wie folgt aus:

service:jmx:rmi:///jndi/rmi://(hostname):(jmxport)/jmxrmi 
0

die /etc/hosts auf Linux wechseln, wo ich die localhost-Adresse an die Maschine ip zugeordnet auf mein Konto ersetzt, löste dieses Problem für mich.

35

Ich habe Informationen über das Internet gesammelt gesammelt, mit Hinweisen von anderen Mitgliedern gefunden.

Die meisten durch JMX verursachten Probleme sind (imo) die Tatsache, dass JMX einen zweiten dynamisch zugewiesenen Netzwerkport öffnet. Eine Firewall (wie iptables) wird dies blockieren.

Lösung für tomcat auf Linux:

Verwendung tomcat 6.0.24 oder neue herunterladen catalina-JMX-remote.jar von Apache Tomcat Extras (Verwendung browse auf tomcat Download-Seite) es in dem $ CTALINA_HOME \ kopieren

lib

auf diese Weise können Sie beide Ports von JMX eingestellt,

bearbeiten Server-Abschnitt in Ihrem server.xml

<Server port="8005" ..> 
    ... 
    <Listener className="org.apache.catalina.mbeans.JmxRemoteLifecycleListener" rmiRegistryPortPlatform="9840" rmiServerPortPlatform="9841"/> 

einige Umgebungsvariablen einstellen (z.B. in setenv.sh)

CATALINA_OPTS=" 
    -Djava.rmi.server.hostname=IP-TO-LISTEN 
    -Dcom.sun.management.jmxremote.password.file=$CATALINA_BASE/conf/jmxremote.password 
    -Dcom.sun.management.jmxremote.access.file=$CATALINA_BASE/conf/jmxremote.access 
    -Dcom.sun.management.jmxremote.ssl=false" 

aktiviert diese Zugriffskontrolle für JMX

jmxremote.Zugang wird wie folgt aussehen

monitorRole readonly 
controlRole readwrite 

Ende jmxremote.password

wird
monitorRole tomcat 
controlRole tomcat 

(nur einfache Leerzeichen)

Neustart Kater.

Jetzt konfigurieren Firewall auf dem Server (zB iptables)

/etc/sysconfig/iptables

-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 9840 -j ACCEPT 
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 9841 -j ACCEPT 

und/etc/sysconfig/ip6tables

-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 9840 -j ACCEPT 
-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 9841 -j ACCEPT 

Neustart iptables

Fertig!

Verwenden Sie nun VisualVM oder JConsole auf Ihrer Workstation, um eine Verbindung zu rmiRegistryPortPlatform, 9840 in unserem Beispiel, herzustellen.

Wenn zwischen Arbeitsstation und Server keine Firewall mehr vorhanden ist, sollte es funktionieren.

+0

+1 Trawled überall für diese Info, funktioniert super – Aitch

+3

+1 danke! hat super funktioniert! Ich musste nur noch eine Zeile hinzufügen: '-Djava.rmi.server.hostname = '. –

+0

Sollte in tomcat.conf auch '-Dcom.sun.management.jmxremote.port = 9840' stehen? –

0

Nun, ich hatte dieses Problem in einer Linux-Box (virtuelle Maschine) und ich reparierte es mit -Djava.rmi.server.hostname Eigenschaft, aber es gibt etwas, das ich nicht verstehen kann. Mein Rechner hat 5 Tomcat-Server, alle haben jmx in aufeinanderfolgenden Ports (8008,8018,8028 ...) aktiviert und nur einer von ihnen hatte dieses Problem beim Verbinden von JMX. Keine Firewall, keine -Djava.rmi.server.hostname Eigenschaft in jedem Tomcat ....

So ist die Sache, dass ich das Problem verstehe, aber ich kann nicht verstehen, warum 4 meiner Tomcats arbeiteten und 1 von ihnen nicht .

P.D: Mein Englisch ist sehr arm, ich weiß. Entschuldigen Sie.

0

PROTIP: Sie müssen die RMI-Registry und JMX/RMI-Server-Ports reparieren (wie mit einer bekannten Nummer). Sie tun dies, indem Sie JAR-Datei in das Lib-Verzeichnis einfügen und einen speziellen Listener konfigurieren. (Und natürlich die üblichen Flags für JMX Aktivierung

-Dcom.sun.management.jmxremote \ 
    -Dcom.sun.management.jmxremote.port=8999 \ 
    -Dcom.sun.management.jmxremote.ssl=false \ 
    -Dcom.sun.management.jmxremote.authenticate=false \ 
    -Djava.rmi.server.hostname=<HOSTNAME> \ 

Siehe auch: JMX Remote-Lifecycle-Listener bei http://tomcat.apache.org/tomcat-6.0-doc/config/listeners.html

2

, wenn Sie unter Linux arbeiten, ändern die catalina.sh Datei hinzufügen:

   CATALINA_OPTS="-Dcom.sun.management.jmxremote -Djava.rmi.server.hostname=<HOST_IP> -Dcom.sun.management.jmxremote.port=<HOST_PORT> -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false" 
      export CATALINA_OPTS 

oder ändern Sie die Datei/etc/profile als root und führen Sie die Datei erneut aus (source/etc/profile)

Wenn Sie an Windows arbeiten und Tomcat von th starten e-Befehlszeile verwenden die Umgebungsvariable CATALINA_OPTS

, wenn Sie auf Windows arbeiten und tomcat als Dienst starten, müssen Sie den Monitor Service Utility verwenden, um die Service-Initialisierungsparameter (weder setenv.bat konfigurieren , catalina.bat oder env-vars werden funktionieren). Dazu benötigen Sie den Dienstnamen, der in services.msc aufgeführt ist (z. B. jasperreportsTomcat). Danach müssen Sie eine Konsole als Administrator öffnen und ausführen (zum Beispiel): tomcat6w.exe // MS // jasperreportsTomcat

Mit diesem Befehl erscheint ein Tray-Icon, wo Sie ein Panel öffnen können. Auf der Registerkarte "Java" können Sie jetzt die jmx-Optionen ändern. Achten Sie darauf, keine nachgestellten Leerräume hinzuzufügen und verwenden Sie das "[Enter]" - Symbol, um jede Option Zeile für Zeile zu trennen.

-Dcom.sun.management.jmxremote 
-Djava.rmi.server.hostname=192.168.61.101 
-Dcom.sun.management.jmxremote.port=9999 
-Dcom.sun.management.jmxremote.ssl=false 
-Dcom.sun.management.jmxremote.authenticate=false 

Hoffen, dass es

1

hilft bekam ich etwas für sie alle, um die Untersuchung von dieser ganzen Sache abzuschließen. Es gibt einen Trick, es passiert, dass das Profiler-Tool über einen Port mit dem jvm verbunden wird, aber der jvm setzt die Konversation mit einem anderen zufälligen Port fort. Wenn der jvm auf einem Remotecomputer ausgeführt wird (z. B. Tomcat-Webanwendungsserver) und der Remotecomputer Schutz vor ausgehenden und eingehenden Verbindungen bietet, müssen Sie die Java-Systemeigenschaft com.sun.management.jmxremote.rmi.port auf denselben Wert der Eigenschaft com.sun.management.jmxremote.port festlegen

Quelle: https://serverfault.com/questions/308662/how-do-i-fix-a-failed-to-retrieve-rmiserver-stub-jmx-error Und auch diese Besuche: http://blog.cantremember.com/debugging-with-jconsole-jmx-ssh-tunnels/

Hoffnung Jungs zu tragen!

Und viel Glück!

1

Überprüfen Sie, ob sich Ihr Server hinter der Firewall befindet. JMX basiert auf RMI, die beim Start zwei Ports öffnen. Einer ist der Registerport, der Standardwert ist 1099, und er kann mit der Option com.sun.management.jmxremote.port angegeben werden. Der andere ist für die Datenkommunikation und ist zufällig, was das Problem verursacht. Eine gute Nachricht ist, dass dieser zufällige Port von JDK6 aus mit der Option com.sun.management.jmxremote.rmi.port angegeben werden kann.

fügen in die Zeile {TOMCAT_DIR} /bin/setenv.sh:

export CATALINA_OPTS="-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=8991 -Dcom.sun.management.jmxremote.rmi.port=8991 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false" 
10

Versuchte mit Java 8

1. Fügen Sie diese tomcat Startskript Java:

-Dcom.sun.management.jmxremote.port=1616 
-Dcom.sun.management.jmxremote.rmi.port=1616 
-Dcom.sun.management.jmxremote.ssl=false 
-Dcom.sun.management.jmxremote.authenticate=false 
-Dcom.sun.management.jmxremote.local.only=false 
-Djava.rmi.server.hostname=localhost 

zum Beispiel in den Behälter hinzufügen/setEnv.sh dies:

export CATALINA_OPTS="$CATALINA_OPTS \ 
-Dcom.sun.management.jmxremote.port=1616 \ 
-Dcom.sun.management.jmxremote.rmi.port=1616 \ 
-Dcom.sun.management.jmxremote.local.only=true \ 
-Dcom.sun.management.jmxremote.authenticate=false \ 
-Dcom.sun.management.jmxremote.ssl=false " 

2. Führen Sie dies auf Ihrem Computer aus.

3.e Starten Sie jconsole auf Ihrem Computer

jconsole localhost:1616 

4. Vielen Spaß!

  • P.S.: In Schritt 2 mit ssh und -L geben Sie an, dass der Port 1616 auf dem lokalen (Client-) Host an die Gegenstelle weitergeleitet werden soll.
  • P.S.2 .: können Sie denselben Port für JMX und RMI Gespräche
+0

Dank konnte rmiregistry und rmicomm in einem gleichen Port ausführen. Dies funktioniert ohne tomcat/conf/server.xml JMXRemoteLifecycleListener. Gibt es irgendwelche Probleme sollte bewusst sein, wenn nicht diesen Listener zu verwenden? – Whome

+0

@Whome Leider habe ich Ihren Kommentar verpasst. Nein, meiner Erfahrung nach gibt es keine Gegenanzeigen. – freedev

3

aktivieren JMX in Tomcat8, geben Sie erfolgreich in meinem POC getestet

1/in $CATALINA_HOME/lib die catalina-jmx-remote.jar von Apache Website und Ort zum Download.

2/Take server.xml/setenv.sh Sicherung. Nehmen Sie die Änderungen an server.xml wie unten-

<Listener className="org.apache.catalina.mbeans.JmxRemoteLifecycleListener" rmiRegistryPortPlatform="10001" rmiServerPortPlatform="10002" /> 

3/Nehmen Sie die Änderungen an $CATALINA_BASE/bin/setenv.sh wie -

[...] 

JVM_OPTS="[...] 
-Dcom.sun.management.jmxremote 
-Dcom.sun.management.jmxremote.authenticate=true 
-Djava.rmi.server.hostname=<eth:0_IP>| <`hostname -i`> 
-Dcom.sun.management.jmxremote.password.file=/apps/data/apache-tomcat-8_8080/conf/jmxremote.password 
-Dcom.sun.management.jmxremote.access.file=/apps/data/apache-tomcat-8_8080/conf/jmxremote.access 
-Dcom.sun.management.jmxremote.ssl=false 
-Dcom.sun.management.jmxremote.local.only=false 
-Dcom.sun.management.jmxremote=true " 

4/Erstellen Sie diese beiden Dateien als - $touch $CATALINA_BASE/conf/jmxremote.password enthält:

Admin letmein

$touch $CATALINA_BASE/conf/jmxremote.access enthält:

Admin-Lese-Schreib-

$ chmod 600 jmxremote.password 

5/Restart tomcat und Test auf jconsole Werkzeug :)

$echo|telnet 10.105.14.90 10001