Odelia>Technologiesbeta

Exposer un script Groovy via JMX sur JBoss

| |

L'API JMX est au cœur du serveur d'application JBoss ; avant de pouvoir exposer des services au travers de l'API JMX, ceux-ci sont déployés au moyen de services spécialisés eux-mêmes administrables via JMX.
Cet article discute d'un tel service - que nous avons développé à titre expérimental -, de type « deployer », capable de déployer tout script Groovy sur le serveur d'application et de l'exposer en tant que MBean ou bean administrable.
Nous montrerons aussi comment déclencher, par appel distant, l'exécution d'un script Groovy déployé, au moyen d'un autre script Groovy !

Déployer un script Groovy

Le service JBoss proposé en fichier joint et testé avec JBoss 4.0.5, groovy-deployer.sar, est un « deployer » de script Groovy ; vous pouvez également obtenir le code source de ce service en récupérant le fichier joint groovy-deployer-src.zip.

Avant d'installer le service groovy-deployer pour la configuration default par exemple :
- assurez-vous que le serveur JBoss est bien arrêté ;
- copiez la librairie Groovy groovy-all-1.5.x.jar dans le répertoire default/lib
- démarrez le serveur d'application
- copiez le fichier groovy-deployer.sar dans le répertoire default/deploy

Le service se déploie comme nouveau « deployer » capable de déployer tout fichier script d'extension .groovy apparaissant dans le répertoire default/deploy.
Pour vérifier que ce nouveau « deployer » est en place, vous pouvez démarrer un navigateur Internet afin d'accéder à la console d'administration JMX de JBoss (naviguez vers http://localhost:8080/jmx-console/ si vous avez ouvert votre navigateur depuis la même machine exécutant le serveur d'application).
Vous devriez apercevoir le service GroovyDeployer (service=GroovyDeployer) sous le nom de domaine jboss.deployer.

Le « deployer » groovy-deployer prend en charge le déploiement de tout fichier d'extension .groovy apparaissant dans le répertoire default/deploy et l'expose via JMX. Pour cela, le « deployer » crée une instance de la classe com.odelia.groovy.GroovyScript, et l'enregistre sur le serveur de MBeans, avec une instance de la classe ObjectName créée à partir de la chaîne de caractères :

jboss.scripts:type=Groovy,script=nom_fichier.groovy

La classe GroovyScript conserve en interne l'URL vers le fichier script associé ; celle-ci implémente par ailleurs l'interface JMX définie ci-dessous :

public interface GroovyScriptMBean extends ServiceMBean {
  public void evaluate();
  public URL getUrlScript();
}

La propriété UrlScript du MBean sera accessible en lecture seule, tandis que l'on pourra invoquer l'opération evaluate dans le but d'exécuter le script Groovy depuis le serveur d'application.

Déployer et exécuter le script de test Salut.groovy

Déployez le fichier script de test Salut.groovy, contenant par exemple le code (simple) Groovy ci-dessous, en le copiant dans le répertoire default/deploy :

3.times { println "Salut tout le monde ! ($it) " }

Dans l'application console d'administration JMX de JBoss, le script sera ainsi exposé par le MBean correspondant au lien :

script=Salut.groovy,type=Groovy

pour le domaine jboss.scripts.

Pour retrouver plus facilement tous les liens de ce domaine, vous pouvez toujours appliquer le filtre jboss.scripts*:* dans la zone d'édition placée en début de page web.

Donc, en accédant à la vue MBean, vous pouvez retrouver la valeur de la propriété en lecture seule UrlScript, de type java.net.URL, indiquant l'emplacement du fichier script ; et parmi la liste des opérations du MBean, l'opération evaluate est disponible et invocable au travers du bouton Invoke de la page.
Bien sûr, cliquer sur ce bouton provoque l'exécution du script Groovy, et dans le cas de notre script, l'affichage de trois messages de salutation vers la sortie standard.

La classe GroovyScript implémente la méthode GroovyScriptMBean.evaluate et a recours à une instance de la classe GroovyShell pour exécuter le code Groovy contenu dans le fichier de script.

Accéder à un MBean par Groovy

Groovy dispose de la classe GroovyMBean (voir la page Groovy and JMX) permettant l'accès à un MBean (ses propriétés et opérations JMX) comme si celui était un objet normal.

Supposons que vous vouliez afficher la version du serveur JBoss en cours d'exécution, en Groovy. Pour cela, créez une instance de la classe GroovyMBean avec le nom JMX jboss.system:type=Server ; ce MBean expose la propriété JMX Version.
Le code Groovy serait :

def mbean = new GroovyMBean(server, 'jboss.system:type=Server')
println mbean.Version

Dans ce code, server est une référence vers un objet de connexion du serveur de MBean s'exécutant dans JBoss.

Nous pouvons aussi déclencher l'exécution de notre script Salut.groovy déployé sur le serveur, par appel de l'opération evaluate sur le MBean de nom JMX jboss.scripts:type=Groovy,script=Salut.groovy :

def mbean = new GroovyMBean(server, 'jboss.scripts:type=Groovy,script=Salut.groovy')
mbean.evaluate()

Voici maintenant le code Groovy reprenant l'utilisation d'objets GroovyMBean, ainsi que l'accès au serveur JBoss par JMX de manière distante, au travers d'une connexion RMI :

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

// Voir http://wiki.jboss.org/wiki/Wiki.jsp?page=UsingTheRMIAdaptor

Properties props = new Properties()
props.setProperty("java.naming.factory.initial", "org.jnp.interfaces.NamingContextFactory")
props.setProperty("java.naming.factory.url.pkg", "org.jboss.naming:org.jnp.interfaces")
props.setProperty("java.naming.provider.url", "localhost")

MBeanServerConnection server;
server = (MBeanServerConnection)new InitialContext(props).lookup("jmx/rmi/RMIAdaptor");

// Utilisation de la classe ObjectName
ObjectName on = new ObjectName('jboss.system:type=Server');
String version = server.getAttribute(on, 'Version');
println "1. Version de JBoss : $version"

// Plus directement
def mbean1 = new GroovyMBean(server, 'jboss.system:type=Server')
println "2. Version de JBoss : $mbean1.Version"

// Exécution du script Salut.groovy déployé sur le serveur
def mbean2 = new GroovyMBean(server, 'jboss.scripts:type=Groovy,script=Salut.groovy')
mbean2.evaluate()

Attention ! Pour fonctionner correctement, ce code demande l'utilisation des librairies JBoss jboss-jmx.jar et jbosall-client.jar à l'exécution. Celui-ci a été testé dans la console Groovy, les deux librairies mentionnées ayant été placées dans le répertoire lib du répertoire d'installation de Groovy.

JBoss dispose aussi d'un « deployer » de scripts BeanShell, et tire partie de la définition de MBeans dynamiques. De la même manière, pour aller plus loin, le MBean créé pour un script Groovy pourrait être de type dynamique, et exposer de manière automatique des propriétés et des opérations JMX en fonction d'une classe Groovy, ou en tout cas, en exploitant la méta programmation du langage Groovy.

Fichier attachéTaille
groovy-deployer-src.zip3.51 Ko
groovy-deployer.sar4.95 Ko

balises dans Langages et systèmes

AJAX cajo Camel DSL Grails Groovy Java JBI prefuse RSS ServiceMix SOA