Tomcat/JMX

Tomcat utilise simplement le MBean server de la JVM et y enregistre ses MBeans.

Il existe plusieurs façon d'accéder à Tomcat en JMX.

JConsole

Tomcat est accessible par défaut par la JMX console, du moins en local.

MBeans Tomcat

Problème d'accès

Avec certains updates de la JVM 6, jConsole ne voit pas le process Tomcat. Ce problème n'est pas spécifique à jConsole, on le retrouve aussi avec jps et d'autres utilitaires du JDK. Le problème n'est pas lié non plus à la version de Tomcat, je l'ai rencontré en Tomcat 6 et en Tomcat 7.

Comme l'explique le billet (injustement) ouvert sur le sujet, le problème vient de la gestion des répertoires temporaires. La JVM écrit des informations dans un répertoire temporaire hsperfdata_$USER pour qu'elles soient exploitées par jConsole, jps et autres utilitaires. Dans les updates plus anciens, ce répertoire était créé dans le répertoire temporaire du système (/tmp) alors que dans les versions plus récentes (> JRE 6u20), il est créé dans le répertoire temporaire de Java. Par défaut, c'est la même chose, mais lors du lancement du process, la variable java.io.tempdir permet de redéfinir ce dernier.

Or dans les scripts de démarrage de Tomcat, il y a -Djava.io.temp=$CATALINA_HOME/tmp. Par conséquent, le répertoire hsperfdata_$USER du process Tomcat est dans le répertoire temporaire de Tomcat et jConsole le cherche dans le répertoire temporaire du système. C'est pour cela que jConsole ne trouve pas notre process Tomcat.

Pour résoudre le problème, il faut aussi modifier le répertoire temporaire de jConsole :

jconsole -J-Djava.io.tmpdir=$CATALINA_HOME/temp

La même solution s'applique à jps :

jps -J-Djava.io.tmpdir=$CATALINA_HOME/temp

Remarque : cette solution n'a fonctionné dans tous mes environnements.

OS JDK Version
Ubuntu OpenJDK 1.6.0_20 OK
MacOS X HotSpot 1.6.0_24 KO

JMX remote

JMX proxy