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!

Vous devez éditer votre question de départ, et comprennent les exemples de code que vous avez été poster dans les commentaires.

OriginalL'auteur Devesh | 2011-09-01