Wie Sie festlegen, JMX remote port system-Umwelt-Parameter, die durch die java-code für die remote-überwachung?
Ich habe ein Programm, welches erfordert, die dynamisch (d.h. zur Laufzeit) öffnen Sie eine verfügbare Steckdose, und starten Sie eine JMX-Agenten. Diese JMX-Parameter werden innerhalb der Java-code und nicht durch Befehl Linie. Dies funktioniert sehr gut. Danach ist es erforderlich, zu überwachen( ich.e Problem JMX-Kommandos etc), die durch die Java Visual VM
aus der Ferne
Den RMI-server-Agenten in das Programm ist auf den Linien von out-of-box-management beschrieben:
http://download.oracle.com/javase/6/docs/technotes/guides/management/agent.html
Die Frage, die ich habe können wie folgt zusammengefasst werden:
Wie können die Befehl Linie Eigenschaften festgelegt werden, um die system-Ebene
durch die Java-code so, dass das remote-profiling verwendet werden kann??
-Dcom.sun.management.jmxremote.port=1234
Wenn die "jmxremote.port" und andere Parameter festgelegt sind, über die Befehlszeile,
remote-überwachung funktioniert gut. Ich bin auf der Suche nach einem Weg, dies zu tun durch Java
und nicht über die Befehlszeile.
Kann das Programm nicht den port angeben, über die Befehlszeile, wie der neue port hat dachte werden zur Laufzeit.
Muss der Prozess der remote-überwachung und es funktioniert auch lokal.
Wenn die folgenden Parameter sind nicht angegeben auf der Befehlszeile, die Java Visual VM keine Verbindung zum Prozess.
-Dcom.sun.management.jmxremote.port=1234
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
-Djava.rmi.server.hostname=10.0.0.128
Habe ich versucht.
System.setProperty("com.sun.management.jmxremote.port",Integer.toString(port));
Dies ist eines der ersten Dinge, die getan im Programm, bevor die JMXConnectorServer. Leider wird Sie nicht erkannt. Nur die Laufzeit-Eigenschaften (D. H. über die Befehlszeile angegeben werden anerkannt, für die JMX-Verbindung von Java Visual VM).
Kam auch über die Art und Weise Eigenschaften extrahiert werden, die von der java-collection-Klassen, konnte aber nicht erreichen, wie verfolgen Sie die Eigenschaft "com.Sonne.management.jmxremote.port="
public static void setEnv(Map<String, String> newenv) throws Exception {
Class[] classes = Collections.class.getDeclaredClasses();
Map<String, String> env = System.getenv();
for(Class cl : classes) {
if("java.util.Collections$UnmodifiableMap".equals(cl.getName())) {
Field field = cl.getDeclaredField("m");
field.setAccessible(true);
Object obj = field.get(env);
Map<String, String> map = (Map<String, String>) obj;
//map.clear();
map.putAll(newenv);
}
}
}
Jede mögliche Hilfe würde geschätzt!
- Sollten Sie Bearbeiten Ihre ursprüngliche Frage beinhalten und die code-Beispiele habe, dass Sie Entsendung in den Kommentaren.
Du musst angemeldet sein, um einen Kommentar abzugeben.
kbec die Antwort zeigte den Weg, aber nicht für mich arbeiten - aber durch den Blick auf dieser Beitrag ich war in der Lage, es zu ändern und eine funktionierende Lösung.
Dies funktioniert in Eclipse allerdings bekommen es zu arbeiten auf der Kommandozeile ist eine andere Sache - es gibt einige Diskussionen darüber hier Warum wird mit dem Java-Attach-API-Fehler auf linux? (auch wenn maven-build abgeschlossen ist)
aber ich fand, hinzufügen von $JAVA_HOME/lib/tools.jar mein classpath das problem gelöst.
Wirst du über dieses etwas der falsche Weg. Durch die Zeit, die Ihr code aufgerufen wird, Sie habe die chance verpasst, für die diese Eigenschaften haben keine Auswirkungen.
Müssen Sie erstellen ein RmiRegistry und dann erstellen Sie eine JMXConnectorServer die mit der Plattform verlinkt MBeanServer wie diese:
Wenn Sie nicht angeben, eine
jmxremote
env run-param dann die JMX-management-agent konnte nicht geladen werden. Sie können versuchen, diese für die dynamische Belastung :Müssen Sie
jdk/lib/tools.jar
Ich habe versucht, einige Möglichkeiten zu geben das jmxremote-port von java-code, um eine Verbindung auf einem bestimmten port und herausgefunden das folgende:
Im Falle jmxremote arg angegeben ist:
Die Plattform-mbean-server wird gestartet, indem die JVM, bevor mein code ändert die notwendigen jmxremote-System.Eigenschaften. Jede mbean-server hat einen eigenen registry-Bohnen. Der plaform-und JVM-mbeans registrieren konnten Ihre eigenen Bohnen, um es auf eine andere Art und Weise.
Können Sie erstellen eine Alternative mbean-server, nachdem Sie die jmx-port-Eigenschaften. Das hören auf die richtige jmx-port, den Sie angegeben haben.
Diese Weise wählen Sie Plattform-server :
Diese Weise Ihre eigenen :
Bedenken Sie auch, dass linux hat es loopback-Schnittstelle, so dass Sie sollten geben Sie den korrekten Hostnamen explizit zu hören.
Dies ist nicht empfohlen Verwendung eines anderen MBeanServer als die Plattform nach Anleitungen, aber ich kann mir vorstellen, dass einige Situationen, in denen die Kommandozeilen-Optionen nicht so sind, wie können Sie starten einen server.
Dies ist es, was für mich funktioniert. Referenz Oracle, JMX Tutorial. Ich gehe davon aus, dass Sie bereits wissen, wie zu Recht SimpleMXBean verwendet, im Beispiel weiter unten.
System.setProperty()
ist identisch mit der-D
Befehlszeile-option. Aber offenbar müssen Sie es früh genug, dass Sie die-Eigenschaft festlegen, bevor es gelesen wird.-Dcom.sun.management.jmxremote
und setzen dieses in runtime env später ist schlechte Idee, da die JMX-agent konnte nicht geladen werden, so kann es nicht verwendet werden.