MBeans

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

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.