Comment définir JMX port distant système de paramètres de l'environnement par le biais de code java pour la surveillance à distance?
J'ai un programme qui exige de manière dynamique (c'est à dire au moment de l'exécution) de l'ouverture d'un emplacement disponible et commencer un agent JMX. Cette JMX paramètres sont fixés à l'intérieur du code Java et non par le biais de la ligne de commande. Cela fonctionne très bien. Par la suite, il est nécessaire de surveiller( j'.e numéro de JMX commandes, etc) par le biais de Java Visual VM
à distance
Le RMI server agent dans le programme est sur les lignes de la zone de gestion décrits à:
http://download.oracle.com/javase/6/docs/technotes/guides/management/agent.html
La question que j'ai peut être ainsi résumée:
Comment ces propriétés de ligne de commande être mis à niveau du système
par le code de Java, de sorte que la distance de profilage peut être utilisé??
-Dcom.sun.management.jmxremote.port=1234
Si le "jmxremote.port" et d'autres paramètres sont définis par l'intermédiaire de la ligne de commande,
la surveillance à distance fonctionne très bien. Je suis en train d'essayer de trouver un moyen de le faire en Java
et pas par le biais de la ligne de commande.
Le programme ne peut pas spécifier le port à travers la ligne de commande comme le nouveau port disponible doit être compris au moment de l'exécution.
Le processus des besoins de surveillance à distance et il fonctionne très bien en local.
Si les paramètres suivants ne sont pas spécifiées en ligne de commande, Java, Visual VM ne se connecte pas au processus.
-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
J'ai essayé.
System.setProperty("com.sun.management.jmxremote.port",Integer.toString(port));
C'est l'une des premières choses à faire dans le programme avant de commencer la JMXConnectorServer. Malheureusement, il n'est pas reconnu. Seulement, le temps d'exécution propriétés (c'est à dire spécifié sur la ligne de commande sont reconnus pour la connexion JMX par Java Visual VM).
Aussi est venu à travers la façon dont les biens peuvent être extraites à partir de java classes de collection, mais ne pouvait pas atteindre le mode de suivi de la propriété "com.soleil.de la gestion.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);
}
}
}
Toute aide serait appréciée!
OriginalL'auteur Devesh | 2011-09-01
Vous devez vous connecter pour publier un commentaire.
kbec réponse a montré la voie, mais n'a pas de travail pour moi - mais en regardant ce post j'ai été en mesure de le modifier et d'obtenir une solution de travail.
Cela fonctionne dans Eclipse cependant à la faire fonctionner à la ligne de commande est une autre question - il y a une discussion à ce sujet ici Pourquoi l'utilisation de Java Joindre API échouer sur linux? (même si maven build complète)
mais j'ai trouvé que l'ajout de $JAVA_HOME/lib/tools.jar à mon classpath résolu le problème.
OriginalL'auteur Mark Butler
Vous allez sur un peu de la mauvaise façon. Par le temps que votre code est appelé vous avez raté la chance pour ces propriétés avoir aucun effet.
Vous avez besoin pour créer un RmiRegistry, puis de créer un JMXConnectorServer lié à la plate-forme MBeanServer comme ceci:
OriginalL'auteur AutomatedMike
Si vous ne spécifiez aucun
jmxremote
env run param puis JMX agent de gestion n'a pas été chargé. Vous pouvez essayer ce pour le chargement dynamique :Vous devez inclure
jdk/lib/tools.jar
OriginalL'auteur kbec
J'ai essayé quelques méthodes pour spécifier le jmxremote port à partir du code java d'avoir une connexion sur un port spécifique et ont compris les suivantes:
En cas jmxremote arg est spécifié:
Le plate-forme mbean server est commencé par la JVM, avant que mon code modifie la nécessaire jmxremote Système.les propriétés. Chaque mbean server dispose d'un registre de haricots. La platforme et de la JVM mbeans n'a pas pu inscrire leurs propres haricots sur une autre manière.
Vous pouvez créer un autre mbean server après avoir configuré les propriétés du port jmx. Qui sera à l'écoute sur le bon port jmx, vous avez spécifié.
De cette façon, vous choisissez le serveur de la plateforme :
De cette façon votre propre :
aussi considérer que linux c'est de l'interface de bouclage donc vous devez spécifier le nom d'hôte correct explicitement à écouter.
C'est pas recommandé d'utiliser un autre MBeanServer que la plate-forme, selon les manuels, mais je peux imaginer des situations où les options de ligne de commande ne sont pas de la façon dont vous pouvez lancer un serveur.
OriginalL'auteur kisp
C'est ce qui fonctionne pour moi. Référence Oracle Tutoriel JMX. Je suis en supposant que vous savez déjà comment droit SimpleMXBean utilisé dans l'exemple ci-dessous.
OriginalL'auteur rahul maindargi
System.setProperty()
est identique à la-D
option de ligne de commande. Cependant évidemment, vous devez appeler assez tôt et que vous définissez la propriété avant d'être lu.Application en cours d'exécution sans
-Dcom.sun.management.jmxremote
et la définition de cette env lors de l'exécution ultérieure est une mauvaise idée car l'agent JMX n'a pas été chargé, de sorte qu'il ne peut pas être utilisé.OriginalL'auteur user207421