Projets

Comparaison des versions

Légende

  • Ces lignes ont été ajoutées. Ce mot a été ajouté.
  • Ces lignes ont été supprimées. Ce mot a été supprimé.
  • La mise en forme a été modifiée.
Balise Wiki
h2. Généralités

Le support de JMX dans Spring offre des fonctionnalités simples et   transparentes pour intégrer votre application Spring dans une   infrastructure JMX.
Spring JMX vous permet entre autres d'enregistrer automatiquement n'importe quel bean Spring en tant que *MBean* JMX.

La classe principale de Spring JMX est *MBeanExporter*. Cette classe  est  responsable de prendre en charge et d'enregistrer vos beans Spring  dans  un *MBeanServer*.

Pour exposer les propriétés et les méthodes d'un bean en tant   qu'attributs et opérations d'un MBean, il faut simplement configurer   une instance de la classe MBeanExporter dans le fichier de   configuration.

La propriété "beans" de la classe MBeanExporter permet de savoir exactement  quels beans doivent être exporté au MBeanServer.

Spring JMX offre aussi la possibilité de créer un connecteur serveur  pour  permettre l'accès au MBeanServer à distance. Pour cela il utilise  le  connecteur JSR-160.

h2. Exemple: surveillance de la disponibilité d'un service CMIS par une application "cliente"

Une application de gestion de fichier s'appuie sur un serveur CMIS  pour stocker ses fichiers. Si ce serveur CMIS n'est pas disponible (pour  maintenance, par exemple), l'application doit continuer à fonctionner  en "mode dégradé" .

Le service *cmisFileStorageService* doit savoir en temps réel  si le service CMIS est actif ou non. Le bean *jmxTestCmis,** *grâce à sa méthode \*getCmisIsReady()*, donne cette information.

Les attributs et méthodes de ce bean sont exposés comme MBean  grâce à la classe Spring *MBeanExporter.*

h3. *Les beans Spring :*

     

{code}
<bean id="cmisFileStorageService"  class="org.esupportail.application.service.fileStorage.CmisFileStorageServiceImpl"  lazy-init="true">
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;        <description>A bean to manage files upload and download to the CMIS server.</description>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;         ...
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; *&nbsp;        <property name="jmxTestCmis" ref="jmxTestCmis"/>*
&nbsp;&nbsp; &nbsp;
    </bean>

&nbsp;&nbsp;&nbsp;    <bean id="*jmxTestCmis*"
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;        class="org.esupportail.application.service.fileStorage.JmxTestCmisImpl">
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;        ...
&nbsp;&nbsp; &nbsp;    </bean>&nbsp;&nbsp;

&nbsp;&nbsp; &nbsp;<\!--&nbsp;    <!-  JMX to control CMIS \-->
&nbsp;&nbsp; &nbsp;    <bean id="exporter" >
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;class="org.springframework.jmx.export.MBeanExporter">
        <property name="beans">
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;<map>
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;*            <map>
                <entry key="bean:name=testCmis" value-ref="jmxTestCmis"/>*
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;</map>
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;</property>
&nbsp;&nbsp; &nbsp;</bean>

            </map>
        </property>
    </bean>
{code}
&nbsp;&nbsp; &nbsp;
&nbsp;&nbsp;&nbsp;

h3. La classe métier cliente JMX

Avant toute opération sur les fichiers elle contrôle la disponibilité  du serveur CMIS et affiche un message d'erreur s'il n'est pas actif.

{code}
public class CmisFileStorageServiceImpl CmisFileStorageServiceImpl  {
         ....

       /**
        * Bean to test if cmis is ready.
        */
       privateprivate JmxTestCmis jmxTestCmis;

       publicpublic void afterPropertiesSet() throws Exception {
                ....
        Assert          Assert.notNull(this.jmxTestCmis,
                             "property jmxTestCmis of class " + this.getClass().getName() + " can not be null");
      }    
    
    ...
       /**
        * @param jmxTestCmis the jmxTestCmis to set
        */
       publicpublic void setJmxTestCmis(final JmxTestCmis jmxTestCmis) {
        this          this.jmxTestCmis = jmxTestCmis;
       }

       publicpublic FileStorage getFile(...) throws IOException {
        FileStorage        FileStorage file = null;
        if        if (jmxTestCmis.getCmisIsReady()) {
                         file            file= ...;
                }
             }  else {
                       System.err.println("--------le service CMIS est indisponible");
             }
        return
        return file;
        }
}
{code}

h3. Lee bean JMXpackage org.esupportail.application.services.fileStorage;

public interface JmxTestCmis {
    &nbsp;&nbsp; &nbsp;/*\*
    &nbsp;&nbsp; &nbsp; * Enable the use of CMIS.
     &nbsp;&nbsp; &nbsp; \*/
    void&nbsp;&nbsp; &nbsp;void enabledCmis();
    
    /**
    &nbsp;&nbsp; &nbsp;
&nbsp;&nbsp; &nbsp;/*\*
&nbsp;&nbsp; &nbsp; * Disable the use of CMIS.
     &nbsp;&nbsp; &nbsp; \*/
    void&nbsp;&nbsp; &nbsp;void disabledCmis();
    
    /**
    &nbsp;&nbsp; &nbsp;
&nbsp;&nbsp; &nbsp;/*\*
&nbsp;&nbsp; &nbsp; * @return the cmisIsReady
     &nbsp;&nbsp; &nbsp; \*/
    Boolean&nbsp;&nbsp; &nbsp;Boolean getCmisIsReady();
}

package org.esupportail.application.services.fileStorage;
import java.io.Serializable;
public class JmxTestCmisImpl implements JmxTestCmis, Serializable {
    &nbsp;&nbsp; &nbsp;/*\*
    &nbsp;&nbsp; &nbsp; * True if cmis is ready.
    &nbsp;&nbsp; &nbsp; * Default value = true.
     &nbsp;&nbsp; &nbsp; \*/
    private&nbsp;&nbsp; &nbsp;private Boolean cmisIsReady;
    public&nbsp;&nbsp; &nbsp;public JmxTestCmisImpl() {
        super();
        cmisIsReady = true;
    }

    @Override
    public&nbsp;&nbsp; &nbsp;@Override
&nbsp;&nbsp; &nbsp;public void disableCmis() {
        cmisIsReady = false;
    }

    @Override
    public&nbsp;&nbsp; &nbsp;@Override
&nbsp;&nbsp; &nbsp;public void enableCmis() {
        cmisIsReady = true;
    }
    
    public&nbsp;&nbsp; &nbsp;
&nbsp;&nbsp; &nbsp;public Boolean getCmisIsReady() {
        return cmisIsReady;
    }
}

h3. L'activation du client JMX

Si l'application écoute le port jmx 9656,par exemple, au lancement de l'application, on aura les options suivantes:-Dcom.sun.management.jmxremote
\-Dcom.sun.management.jmxremote.port=9656
\-Dcom.sun.management.jmxremote.authenticate=false
\-Dcom.sun.management.jmxremote.ssl=false

h3. Activer l'agent JMX sur l'application administrée

L'agent JMX doit être activé sur l'application délivrant le service CMIS

activationJMX.sh#\!/bin/csh
set cmdLineJMXJar=/opt/admin-java/jmx/cmdline-jmxclient.jar
set jmxHost=host.etablissement.fr
set jmXPort=9656
\#No User and password so pass '-'
echo "active l'utilisation de CMIS pour les applications en ecoute sur le port 9656"
/opt/jdk1.6.0/bin/java \-jar ${cmdLineJMXJar} - ${jmxHost}:${port} bean:name=testCmis enabled
desactivationJMX.sh#\!/bin/csh
set cmdLineJMXJar=/opt/admin-java/jmx/cmdline-jmxclient.jar
set port=9656
set jmxHost=host.etablissement.fr
\#No User and password so pass '-'
echo "désactive l'utilisation de CMIS pour les applications en ecoute sur le port 9656"
/opt/jdk1.6.0/bin/java \-jar ${cmdLineJMXJar} \- ${jmxHost}:${port} bean:name=testCmis disabled

h3. Remarques

# L'application cliente JMX ne fait ici que lire l'état du serveur  CMIS. On pourrait imaginer aller plus loin et vouloir l'administrer à  distance.Le serveur de MBean (MbeanServer)
# Le serveur de MBean (MbeanServer) utilisé ici est celui par défaut (celui de tomcat par exemple).