Odelia>Technologiesbeta

Synchronisation avec FeedSync et Grails

| |

Cet article présente un exemple d'application Grails utilisant la spécification FeedSync pour synchroniser des flux de données de manière bidirectionnelle. Appliquée à une application d'entreprise, cette approche peut être reprise pour synchroniser de manière distribuée des données métiers !


FeedSync et le projet mesh4x

Connu auparavant sous le nom de Simple Sharing Extensions (SSE), FeedSync est une spécification proposée par Microsoft qui vise à étendre les formats de syndication de contenu RSS et Atom, afin de permettre le partage de données sur le Web.
Cette spécification décrit notamment de manière précise les meta données à utiliser pour rendre des données partageables entre différents services Web ; appliquées à des données appelées items, ces meta données consistent par exemple en une information de version, ou bien en un historique des mises à jour effectuées.
FeedSync va aussi jusqu'à spécifier l'algorithme permettant la fusion de deux flux contenant les meta données, autorisant ainsi une synchronisation bidirectionnelle entre services web.

Le projet mesh4x regroupe des librairies, des outils et des applications, destinés à simplifier le développement autour de la spécification FeedSync ; actuellement, ce projet propose des implémentations pour les plateformes .NET et Java.
Pour la manipulation des flux de données, mesh4jx dispose de plusieurs types d'adaptateurs dont le but est de fournir un support physique ou protocolaire particulier.


FeedSync dans GrailsBox

Nous avons mis en ligne un exemple de mise en oeuvre de FeedSync sur GrailsBox (notre application web Grails de démonstration de technologies en relation avec Groovy et Grails), qui se base sur l'implémentation Java (mesh4j) du projet mesh4x.

Cet exemple vous permettra de modifier deux flux nommés feed-A et feed-B, au travers d'une interface cliente riche utilisant le framework Ext JS. Vous pourrez ajouter, modifier ou supprimer une item, qui contient la donnée élémentaire partagée.
Dans notre exemple cette donnée est simplement un texte libre qui, dans la grille d'affichage d'un flux, apparaît dans la colonne « Texte ».
Une item qui a été supprimé, apparaîtra dans la grille avec une couleur de texte gris clair, tandis que pour une item considérée en conflit (à la suite d'une synchronisation) la couleur de texte sera rouge. Justement, pour accéder à la page de résolution de conflit, il suffit de sélectionner le ligne de la grille correspondante, puis de cliquer sur le bouton « Résoudre conflit » en entête de grille.

A tout moment, il vous est possible de synchroniser l'un des flux avec l'autre, puis d'accéder à un rapport des opérations effectuées lors de la fusion des deux flux : supposons que vous soyez sur la page de modification du flux feed-A ; vous pouvez alors le synchroniser avec le flux feed-B en activant le lien synchroniser avec feed-B placé en dessous de la grille ; après la synchronisation, le lien rapport d'importation vous permettra de lire le rapport des opérations effectuées par rapport au flux entrant feed-B.
A la suite d'une synchronisation, il est possible qu'une ou plusieurs items se retrouvent marquées comme étant en conflit : l'algorithme de fusion de FeedSync ne pouvant pas déterminer sans ambiguïté quelles sont les versions de ces items à retenir, ce choix doit alors être fait par l'utilisateur.


Une synchronisation bidirectionnelle

La synchronisation mise en œuvre ici, ne s'effectue pas en réalité directement entre deux flux enregistrés dans des fichiers au sein de la même application web.
Techniquement, le code réalise en fait une synchronisation entre, d'une part un flux piloté localement par l'application web, et d'autre part, un flux lié à une URL externe (certes à laquelle répond également l'application). Détaillons ; à une synchronisation correspond deux fusions : la première est locale, entre le flux locale et le flux récupéré via l'URL externe (par une méthode HTTP GET), et la seconde qui est distante, et pour laquelle les données du flux local sont émises vers la même URL par une méthode HTTP POST (l'action Grails qui y répond réalise la fusion).

Bien que limitée à deux flux RSS dans notre exemple, en ayant deux instances de cette application web s'exécutant sur deux machines physiquement distinctes, nous voyons comment synchroniser deux flux de manière bidirectionnelle !


Les adaptateurs mesh4j

Les deux flux, feed-A et feed-B, sont au format RSS 2.0, avec les extensions FeedSync, et sont enregistrés dans l'application web dans deux fichiers XML séparés grâce à la classe FeedAdapter du framework mesh4j.
Par ailleurs, un autre adaptateur de ce framework est utilisé pour permettre l'accès et la fusion avec un flux servi sur le web, la classe HttpSyncAdapter.


Un adaptateur spécifique pour Grails

Pour aller plus loin avec FeedSync et Grails, nous envisageons le développement d'un adaptateur particulier pour Grails, qui consistera à définir des objets métiers spécifiques qui serviront à la persistance des items. L'un des objectifs sera de pouvoir rendre persistant dans une base de données relationnelles des objets métiers Grails arbitraires, probablement en tirant partie de leur encodage automatique en XML.
Ce développement pourrait prendre la forme d'un plugin pour Grails !

balises dans Langages et systèmes

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