Odelia>Technologiesbeta

Publication/Abonnement distribué avec cajo et Groovy

|

John Catherino, qui est l'auteur du projet cajo, a récemment décrit dans son billet Messaging vs. RPC? Let's fuse 'em, comment le modèle publication/abonnement, que l'on retrouve dans les systèmes orientés message, peut être appliqué dans son framework.

Consacré au projet cajo, cet article est le troisième volet après les deux premiers articles d'introduction au projet cajo avec le langage dynamique Groovy : Introduction au projet cajo avec Groovy, et Définir une interface graphique Swing mobile pour un objet cajo distant.
Le but de cet article est de montrer un exemple d'application de la classe utilitaire gnu.cajo.utils.extra.Queue présentée dans le billet de John Catherino, et qui implémente le modèle de messagerie publication/abonnement.
Par comparaison avec l'API JMS, une Queue cajo est similaire à un topic JMS.

Comme auparavant, les exemples de code Groovy présentés dans cet article, pourront être exécutés directement dans la console Groovy venant dans la distribution de Groovy (ici, la version 1.5.6), ce qui est très pratique pour le prototypage de code ! Il faut également copier l'archive cajo.jar du projet cajo dans le répertoire lib de votre installation Groovy.


Démarrer une queue distribuée cajo sans code

La classe utilitaire gnu.cajo.utils.extra.Queue inclut la méthode main qui va nous permettre de d'instancier un objet Queue et rendre la queue immédiatement opérationnelle.
C'est ce qu'une commande, comparable à celle reprise ci-dessous (en spécifiant le chemin adéquat vers la librairie cajo.jar), permet de faire :

java -cp cajo.jar gnu.cajo.utils.extra.Queue

Après son exécution, la queue implicitement nommée void (mais on peut spécifier un nom) s'exécute dans sa propre JVM, et se retrouve accessible de manière distante par l'URL //<machine_hote>:1198/void.


Une queue Groovy

Introduite et présentée dans le premier article consacré au projet cajo, la classe CajoProxy rend la manipulation d'un objet cajo distant plus simple et concise, en tirant partie de la meta programmation de Groovy. Vous pouvez obtenir le fichier code source, CajoProxy.groovy, qui est en pièce jointe à cet article.

Comme nous utilisons ici des scripts exécutés dans la console Groovy, voyons comment créer un objet CajoProxy à partir d'un autre script :

def gcl = new GroovyClassLoader()
Class proxyClass = gcl.parseClass(new File("<chemin>/CajoProxy.groovy"))

def serverHost = '<machine_hote>'
def queue = proxyClass.metaClass.invokeConstructor("//${serverHost}:1198/void")


Rien n'empêche toutefois de reprendre la définition complète de cette classe dans un script ; dans ce cas, nous écririons :

def queue = new CajoProxy("//${serverHost}:1198/void")

A partir de la référence queue, il est alors possible d'ajouter ou de retirer un souscripteur (abonné) en utilisant respectivement les méthodes enqueue et dequeue, à partir même d'une autre JVM.
Et publier un événement dans la queue pour que les souscripteurs en soient automatique notifié, revient tout simplement à invoquer une méthode quelconque avec des arguments ; si l'un des souscripteur présente un méthode marquée public, et ayant une signature correspondante, cette méthode s'exécute.


Un abonné ou souscripteur Groovy

Par simplification, créons un POGO comme souscripteur, puis ajoutons le en tant que tel à la queue (le script complet, fourni en pièce jointe, est SouscriptionQueue.groovy) :

class Consumer {
    public void echo(String msg) {
        println "echo $msg"       
    }
}

def consumer = new Consumer()
queue.enqueue(new Remote(consumer))

En supposant que vous avez démarré la queue void comme expliqué plus haut, vous pouvez exécuter ce script à partir de la console Groovy. A partir de ce moment là, la méthode echo de notre POGO est susceptible d'être invoqué par le framework cajo si l'événement correspondant survient dans la queue void.


Publier un événement dans la queue void

Toute application peut accéder à la queue void et y générer un événement ; voyons comment réaliser cela, toujours au travers d'un script Groovy (le script complet, fourni en pièce jointe, est PublicationQueue.groovy) :

queue.echo('Salut tout le monde !')

C'est tout ? En effet, dans la JVM qui exécute la queue, le framework cajo appellera tout souscripteur possédant une méthode public nommée echo et prenant une chaîne de caractère comme argument.


Test complet

Pour effectuer un test complet, procédez comme ceci, en respectant l'ordre des tâches :
- démarrer la queue void comme expliqué plus haut sur une machine quelconque ; relever le nom de la machine ou son adresse IP
- ouvrir une console Groovy sur la même machine ou une machine différente, puis charger le fichier SouscriptionQueue.groovy ; remplacer par le chemin du répertoire contenant le fichier CajoProxy.groovy, et par le nom de la machine ou l'adresse IP notée ; exécuter le script
- ouvrir une nouvelle console Groovy sur la même machine ou une autre machine, puis y charger le fichier PublicationQueue.groovy ; dans ce script, remplacer <chemin> et <machine_hote> par les mêmes valeurs que précédemment ; exécuter le script ; la première console Groovy affiche le message « echo Salut tout le monde ! ».

Fichier attachéTaille
CajoProxy.groovy.txt314 octets
SouscriptionQueue.groovy.txt469 octets
PublicationQueue.groovy.txt308 octets

balises dans Langages et systèmes

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