L'ESB open source ServiceMix facilitant l'intégration de services écrits en langages de script, cet article détaille le déploiement d'un service codé en langage Groovy dans le conteneur JBI ServiceMix ; l'archive du Service Assembly correspondante sera créée par notre builder Groovy ServiceAssemblyBuilder, tandis que nous montrerons comment invoquer le service Groovy, exposé par un composant de connexion HTTP, au travers d'un client Groovy.
Le composant ServiceMix servcimix-scripting
Depuis sa version 3.3, l'ESB ServiceMix dispose d'un composant JBI de type Service Engine, servicemix-scripting, offrant un support des langages de script au travers de l'API JSR-223 ; il est ainsi possible d'écrire un service JBI dans un langage de script, ce qui prend la forme d'un fichier à intégrer dans une archive JBI de type Service Unit (SU).
Le composant servicemix-scripting de ServiceMix est fourni par défaut avec les moteurs de script Groovy, JRuby et JavaScript ; pour ces langages, il n'y a donc aucune librairie dépendante à fournir pour le déploiement, dans l'archive Service Assembly (SA) à construire.
Générer le fichier JBI ServiceAssembly du service
Voyons comment générer l'archive JBI SA de notre service Groovy implémenté par le code du fichier GroovyExchangeProcessorJSR223.groovy (fourni en tant que pièce jointe), qui est un exemple de service en langage de script fourni par ServiceMix.
Pour cela, nous allons utiliser le builder Groovy ServiceAssemblyBuilder décrit dans notre article MetaBuilder, un builder de builders Groovy ; le builder ServiceAssemblyBuilder définit un DSL (Domain-Specific Language) pour la génération de Service Assembly JBI.
Utilisé en ligne de commande, nous pouvons générer l'archive SA odelia-scripting-2008.11-installer.zip (présent en tant que pièce jointe) à partir de la description de SA suivante, du fichier ServiceAssembly.groovy (également présent en pièce jointe) :
name = 'scripting'
description: 'Scripting avec Groovy'
ServiceUnit {
name = 'http-bc'
target = 'servicemix-http'
Artifact {
filename = 'http/xbean.xml'
}
}
ServiceUnit {
name = 'script'
target = 'servicemix-scripting'
Artifact {
filename = 'groovy/GroovyExchangeProcessorJSR223.groovy'
}
Artifact {
filename = 'groovy/xbean.xml'
}
}
}
Ce descripteur comprend la définition de deux SU : le premier SU permet de définir un service de connexion HTTP pour rendre notre service Groovy accessible au monde extérieur (nous reviendrons sur ce point plus loin) ; le second SU définit, quant à lui, le service Groovy au moyen de deux artefacts : le fichier GroovyExchangeProcessorJSR223.groovy contenant le code du service, et le fichier de configuration xbean définissant le endpoint ServiceMix associé.
Remarquez que pour chaque SU, le description du SA définit le composant cible de déploiement : servicemix-http pour le premier SU, servicemix-scripting pour le second.
Selon la spécification JBI, vous pourrez retrouver le fichier GroovyExchangeProcessorJSR223.groovy, ainsi que les deux fichiers de configuration xbean.xml dans l'archive odelia-scripting-2008.11-installer.zip.
Déployer le Service Assembly odelia-scripting-2008.11-installer.zip
La méthode la plus de déployer notre service dans ServiceMix, est de copier l'archive SA odelia-scripting-2008.11-installer.zip dans son répertoire hotdeploy ; si ServiceMix était en cours d'exécution, celui-ci déploie les deux nouveaux services, puis les démarre.
Comme nous l'avons déjà indiqué, l'un des deux services est un service de connexion HTTP, qui a pour rôle de prendre en charge des requêtes HTTP (de type POST) et de transmettre les messages XML reçus, au service Groovy. L'URI du service HTTP (http://0.0.0.0:8192/Service/) ainsi que le nom du service (test:groovy) auquel transmettre les messages JBI, sont spécifiés dans le fichier xbean.xml allant avec le service HTTP.
Invoquer le service Groovy avec Poster
Un moyen simple d'invoquer notre service Groovy au travers d'une connexion HTTP, est d'utiliser le plugin Firefox Poster, qui est un outil permettant d'effectuer des requêtes HTTP vers des services web et d'en examiner les réponses.
Donc, pour solliciter le service Groovy à partir du plugin Poster, envoyez le contenu XML <test/> par exemple, avec une commande de type POST, vers l'URL http://localhost:8192/Service/. Cela suppose, bien sûr, que ServiceMix s'exécute sur la machine locale avec les deux services déployés.
Si tout se passe bien, la réponse du plugin est celle-ci :
L'élément response et son contenu sont effectivement bien générés par le service Groovy (voir le code source de GroovyExchangeProcessorJSR223.groovy) et retournés au service HTTP qui, à son tour, retourne la réponse au client.
Invoquer le service Groovy avec un client Groovy !
Cette fois, voyons comment invoquer le service Groovy avec du code Groovy relativement simple, que vous pouvez même exécuter à partir de la console Groovy :
conn.requestMethod = 'POST'
conn.doOutput = true
conn.doInput = true
conn.outputStream.withWriter { out ->
out.write('<test/>')
out.flush()
}
if (conn.responseCode == conn.HTTP_OK) {
conn.inputStream.eachLine {
println it
}
}
conn.disconnect()
Le résultat de l'exécution de ce script dans la console est identique au résultat donné par le plugin Poster !
| Fichier attaché | Taille |
|---|---|
| odelia-scripting-2008.11-installer.zip | 2.63 Ko |
| ServiceAssembly.groovy | 414 octets |
| GroovyExchangeProcessorJSR223.groovy | 1.42 Ko |