MBeans

Cette page a été rédigée il y a fort fort longtemps, et n'a pas tellement été mise à jour.

 

Vous savez, moi je ne crois pas qu'il y ait de bonne ou de mauvaise page. Moi, si je devais résumer mon wiki aujourd'hui avec vous, je dirais que c'est d'abord des rencontres. Des gens qui m'ont tendu la main, peut-être à un moment où je ne pouvais pas, où j'étais seul chez moi. Et c'est assez curieux de se dire que les hasards, les rencontres forgent une destinée... Parce que quand on a le goût de la chose, quand on a le goût de la chose bien faite, le beau geste, parfois on ne trouve pas l'interlocuteur en face je dirais, le miroir qui vous aide à avancer. Alors ça n'est pas mon cas, comme je disais là, puisque moi au contraire, j'ai pu ; et je dis merci au wiki, je lui dis merci, je chante le wiki, je danse le wiki... je ne suis qu'amour ! Et finalement, quand des gens me disent « Mais comment fais-tu pour avoir cette humanité ? », je leur réponds très simplement que c'est ce goût de l'amour, ce goût donc qui m'a poussé aujourd'hui à entreprendre une construction logicielle... mais demain qui sait ? Peut-être simplement à me mettre au service de la communauté, à faire le don, le don de soi.

Le composant essentiel de JBoss 4 est le MBean. Tous les composants des couches système de JBoss (deployer, invoker, manager,…​) sont implémentés sous forme de MBeans et déployés dans des services (fichiers .sar).

Voyons comment développer nos propres MBeans et déployer nos propres services.

Développement d’un MBean simple

Un MBean JBoss est constitué d’une interface de management et d’une classe d’implémentation.

Interface de management

L’interface de management est une interface qui

  • hérite de org.jboss.system.Service

  • OU hérite de org.jboss.system.ServiceMBean

  • OU reprend simplement les méthodes de org.jboss.system.Service (create, destroy, start, stop)

package fr.sewatech.jboss.service;

import org.jboss.system.Service;

public interface JobServiceMBean extends Service {
    String getJobName();
    void setJobName(String name);

    void doTheJob();
}

Les interfaces Services et ServiceMBean sont dans le fichier lib/jboss-system.jar.

Classe d’implémentation

La classe du MBean implémente l’interface de management.

package fr.sewatech.jboss.service;

import org.apache.log4j.Logger;

public class JobService implements JobServiceMBean {

    private static Logger logger = Logger.getLogger(JobService.class);

    private String jobName;

    public void doTheJob() {
        logger.info("The Job " + jobName + " is done.");
    }

    public String getJobName() {
        return jobName;
    }

    public void setJobName(String name) {
        this.jobName = name;
    }

    public void create() throws Exception {
        logger.info("Service created");
    }

    public void destroy() {
        logger.info("Service destroyed");
    }

    public void start() throws Exception {
        logger.info("Service started");
    }

    public void stop() {
        logger.info("Service stopped");
    }
}

Déploiement du service

Un service est un fichier d’archive ou répertoire avec une extension sar et contenant un fichier META-INF/jboss-service.xml.

Descripteur de déploiement

Ce fichier décrit les MBeans déployés avec le service ; il permet d’initialiser les propriétés des MBeans.

<?xml version="1.0" encoding="UTF-8"?>

<server>
  <mbean code="fr.sewatech.jboss.service.JobService" name="sewatech:service=job">
    <attribute name="JobName">Hello</attribute>
  </mbean>
</server>

Déploiement

Le déploiement se fait comme pour tout autre fichier d’archive, par copie dans le répertoire deploy (ou équivalent) de la configuration.

Lors du déploiement, les méthodes create() et start() sont appelée (dans cet ordre). Lors d’un retrait (undeploy), les méthodes stop() et destroy() sont appelées.

Appel du MBean

Une fois le services déployé, les MBeans peuvent être appelé depuis du code java, la jmx-console et la commande twiddle.

jmx-console

Les MBeans déployés apparaissent dans la page de garde de la jmx-console. Le détail du MBean montre ses propriétés et ses opérations.

Mbean-job.png

Cette page permet de modifier les propriétés en RW et d’invoquer les opérations.

twiddle

Le répertoire bin de JBoss contient les scripts de lancement (run.bat, run.sh) et d’arrêt (shutdown.bat, shutdown.sh), mais aussi un script d’accès à JMX (twiddle.bat, twiddle.sh).

L’appel d’un opération se fait par la commande invoke.

twiddle invoke "sewatech:service=job" doTheJob

La modification d’une propriété se fait par la commande set.

twiddle set "sewatech:service=job" JobName hello

La lecture d’une propriété se fait par la commande get.

twiddle get "sewatech:service=job" JobName

Cette commande peut être utilisée en local ou à distance, en précisant l’adresse de l’annuaire JNDI dans l’option -s.

Remarque : n’oubliez pas de sécuriser l’accès twiddle !

java distant / RMI

Il est possible d’accéder aux MBeans à distance depuis une classe java, en utilisant l’adaptateur RMI (RMIAdaptor).

package fr.sewatech.jboss.jmxinvoke;

import javax.management.Attribute;
import javax.management.MBeanServerConnection;
import javax.management.ObjectName;
import javax.naming.InitialContext;

public class RMIAccess {
    public static void main(String[] args) throws Exception
    {
       InitialContext ic = new InitialContext();
       MBeanServerConnection server = (MBeanServerConnection) ic.lookup("jmx/invoker/RMIAdaptor");

       // Get the MBeanInfo for the JNDIView MBean
       ObjectName job = new ObjectName("sewatech:service=job");
       server.setAttribute(job, new Attribute("JobName", "hi"));
       server.invoke(job, "doTheJob", null, null);
   }
}

java local

Depuis un autre composant déployé dans JBoss (servlet, EJB, MBean), l’accès est plus simple et ne nécessite pas d’accès au contexte JNDI. Il suffit d’utiliser la factory JMX :

       javax.management.MBeanServer server = (javax.management.MBeanServer) javax.management.MBeanServerFactory.findMBeanServer(null).get(0);

ou d’utiliser les classes spécifiques à JBoss :

       javax.management.MBeanServer server = org.jboss.mx.util.MBeanServerLocator.locateJBoss();

Le reste du code (setAttribute, invoke) est similaire à l’accès RMI.