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.
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.