Wie werden die JMX-Remote-Port-Systemumgebungsparameter über Java-Code für die Remoteüberwachung festgelegt?

9

Ich habe ein Programm, das dynamisch (d. h. zur Laufzeit) einen verfügbaren Socket öffnet und einen JMX-Agenten darauf startet. Diese JMX-Parameter werden innerhalb des Java-Codes und nicht über die Befehlszeile festgelegt. Das funktioniert gut. Danach ist es erforderlich, über Java Visual VM zu überwachen (d. H. JMX-Befehle usw. auszugeben) entfernt

Der RMI-Serveragent im Programm ist in den folgenden Zeilen der Out-of-Box-Verwaltung enthalten: Ссылка

Die Frage, die ich habe, kann wie folgt zusammengefasst werden: Wie können solche Befehlszeileneigenschaften auf Systemebene festgelegt werden? durch den Java-Code, so dass Remote-Profiling verwendet werden kann?

%Vor%

Wenn der "jmxremote.port" und andere Parameter über die Befehlszeile festgelegt werden, Fernüberwachung funktioniert gut. Ich versuche einen Weg zu finden, dies über Java zu tun und nicht über die Befehlszeile.

Das Programm kann den Port nicht über die Befehlszeile angeben, da der neue verfügbare Port zur Laufzeit ermittelt werden muss.

Der Prozess muss remote überwacht werden und funktioniert lokal einwandfrei. Wenn die folgenden Parameter nicht in der Befehlszeile angegeben sind, stellt Java Visual VM keine Verbindung zum Prozess her.

%Vor%

Ich habe es versucht.

%Vor%

Dies ist eines der ersten Dinge, die vor dem Starten des JMXConnectorServers im Programm ausgeführt wurden. Leider wird es nicht erkannt. Nur die Laufzeiteigenschaften (d. H. Über die Befehlszeile angegeben, werden von Java Visual VM für die JMX-Verbindung erkannt).

Es hat sich auch gezeigt, wie Eigenschaften aus Java-Auflistungsklassen extrahiert werden können, aber nicht erreicht werden konnten, wie die Eigenschaft "com.sun.management.jmxremote.port="

verfolgt werden kann %Vor%

Jede Hilfe wäre willkommen!

    
Devesh 01.09.2011, 21:38
quelle

6 Antworten

9

kbecs Antwort zeigte den Weg, funktionierte aber nicht für mich - aber durch den Blick auf diesen Beitrag konnte ich es tun modifiziere es und erhalte eine funktionierende Lösung.

%Vor%

Das funktioniert in Eclipse, aber es funktioniert anders in der Kommandozeile - es gibt eine Diskussion darüber Warum funktioniert die Verwendung der Java Attach API unter Linux nicht? (obwohl maven build fertig ist) aber ich fand das Hinzufügen von $ JAVA_HOME / lib / tools.jar zu meinem Klassenpfad das Problem gelöst.

    
Mark Butler 23.07.2013 01:26
quelle
4

Sie gehen das ein bisschen in die falsche Richtung. Zu dem Zeitpunkt, zu dem der Code aufgerufen wird, haben Sie die Chance verpasst, dass diese Eigenschaften Wirkung zeigen.

Sie müssen eine RmiRegistry erstellen und dann einen JMXConnectorServer erstellen, der wie folgt mit der Plattform MBeanServer verbunden ist:

%Vor%     
AutomatedMike 18.03.2016 13:00
quelle
2

Wenn Sie kein jmxremote env als run-Parameter angeben, wurde der JMX-Verwaltungsagent nicht geladen. Sie können dies für dynamisches Laden versuchen:

%Vor%

Sie müssen jdk/lib/tools.jar

einbeziehen     
kbec 20.06.2012 18:28
quelle
1

Ich habe versucht, den jmxremote-Port aus Java-Code zu spezifizieren, um eine Verbindung an einem bestimmten Port zu haben und habe folgendes herausgefunden:

Falls jmxremote arg angegeben ist: Der Plattform mbean Server wird von der JVM gestartet, bevor mein Code die erforderliche jmxremote System.properties ändert. Jeder mbean Server hat eine eigene Registrierung von Beans. Die Plattformen plaform und JVM konnten ihre eigenen Beans auf andere Weise nicht registrieren.

Sie können einen alternativen mbean-Server erstellen, nachdem Sie die jmx-Port-Eigenschaften eingerichtet haben. Das wird auf den korrekten jmx-Port hören, den Sie angegeben haben.

Auf diese Weise wählen Sie den Plattformserver:

%Vor%

Auf diese Weise Ihre eigenen :

%Vor%

bedenken Sie auch, dass linux über die Loopback-Schnittstelle verfügt. Sie sollten daher den korrekten Hostnamen angeben, auf den explizit zu hören ist.

Dies ist nicht empfohlen nach Manuals einen anderen MBeanServer als die Plattform zu verwenden, aber ich kann mir einige Situationen vorstellen, in denen die Befehlszeilenoptionen nicht die Art sind, wie Sie einen Server starten können.

    
kisp 06.02.2014 12:58
quelle
0

Das ist was für mich funktioniert. Referenz Oracle JMX-Lernprogramm . Ich nehme an, Sie wissen bereits, wie Sie SimpleMXBean im folgenden Beispiel richtig einsetzen können.

%Vor%     
rahul maindargi 12.04.2014 18:48
quelle
0

System.setProperty() ist identisch mit der Befehlszeilenoption -D . Allerdings müssen Sie es natürlich früh genug nennen, dass Sie die Eigenschaft vor dem Lesen setzen.

    
EJP 02.09.2011 00:35
quelle

Tags und Links