PlayFramework et CloudFoundry RELOADED

L’informatique bouge décidément très vite !… A peine quelques jours et mon précédent article est déjà obsolète. Voici donc sa mise à jour.

Problèmes de fixtures

Revenons tout d’abord aux problèmes que j’ai rencontré avec la classe Fixtures, qui provoquaient deux erreurs lors du déploiement de l’application sous forme de WAR. Il s’agissait d’un bug spécifique à la version 1.2 de PlayFramework. Or avant même que j’aie le temps de le temps de dire ouf, la version 1.2.1 était publiée (une journée après mon article), corrigeant le bug en question !

J’ai depuis revérifié mon exemple : plus aucun problème de ce côté. Il est donc possible de déployer l’application YABE sur Cloud Foundry sans avoir à modifier la moindre ligne de code.

1
2
3
4
5
6
cd $PLAY_HOME/samples-and-tests
play war yabe -o yabe_war
cd yabe_war
jar -cvf yabe.war *
rm -rf WEB-INF
vmc push

Ca marche !

Utilisation du service MySQL de CloudFoundry

De ce côté là aussi, les choses ont bougé. Je me suis attelé à la tâche en créant un plugin dédié, dont le code (et les binaires) est disponible sur GitHub. Bon, je n’ai pas beaucoup de mérite : le plus gros du travail a été fait par SpringSource, avec le cloudfoundry-runtime.

Ca a été pour moi l’occasion de me familiariser vraiment avec une des nouvelles fonctionnalités de PlayFramework : la gestion des dépendances Maven. Voici à titre d’exemple le fichier dependencies.yml du plugin :

self: play -> cloudfoundry 0.1
require:
    - play
    - org.cloudfoundry -> cloudfoundry-runtime 0.6.0:
        exclude:
            - org.springframework -> *
            - org.springframework.amqp -> *
            - org.springframework.data -> *
            - org.apache.tomcat -> *
            - commons-dbcp -> *
repositories:
    - spring_milestone:
        type: iBiblio
        root: http://maven.springframework.org/milestone
        contains:
            - org.cloudfoundry -> *

Cette librairie effectue le travail de lecture et de parsing des variables d’environnement. Il suffisait donc ensuite de se servir des résultats de se parsing pour configurer la connexion à la base de données.

Cette fois, c’est le PlayFramework lui-même qui va nous simplifier la tâche. Les plugins peuvent surcharger la méthode onApplicationStart(), qui s’exécute comme son nom l’indique au démarrage de l’application.

1
2
3
4
5
6
7
8
9
10
11
public class CloudFoundryDBPlugin extends PlayPlugin {
    @Override
    public void onApplicationStart() {
        Properties p = Play.configuration;
        MysqlServiceInfo mysqlServiceInfo = getInfoFromCloudFoundryRuntimeLib();
        p.put("db.driver", "com.mysql.jdbc.Driver");
        p.put("db.url", mysqlServiceInfo.getUrl());
        p.put("db.user", mysqlServiceInfo.getUserName());
        p.put("db.pass", mysqlServiceInfo.getPassword());
    }
}

Et c’est tout. Pour utiliser ce plugin, il suffit d’ajouter le module correspondant dans l’application PlayFramework que l’on veut déployer sur Cloud Foundry, soit dans application.conf :

1
2
3
# Replace ce memory db by the cloudfoundry MySQL service
# db=mem
module.cloudfoundry=${play.path}/modules/cloudfoundry

Encore une fois, c’est tout : la magie de PlayFramework se charge du reste !

Il n’y a plus qu’à régénérer le WAR et mettre à jour l’application : ça marche, comme en témoigne l’application mise à jour http://yabe.cloudfoundry.com/

Et maintenant…

Le plugin ne gère pour l’instant que la configuration automatique d’un service MySQL de Cloud Foundry. Mais si des spécialistes de Redis, MongoDB veulent donner un coup de main pour gérer ces bases, les merge request de GitHub sont là pour ça.

 

À propos de Benoît Courtine

Open Source enthousiast, and CTO at Alcion Group.
Ce contenu a été publié dans Java, Systèmes d'information, avec comme mot(s)-clé(s) , , , . Vous pouvez le mettre en favoris avec ce permalien.

3 réponses à PlayFramework et CloudFoundry RELOADED

  1. Loic dit :

    Super utile, merci!

  2. Peiniau dit :

    Il faudrait proposer ton plugin sur le site de Play dans la parti module (ps : j’ai testé avec Mongo et ça fonctionne très bien)

  3. Florian dit :

    Très bon article et très utile. Un petit raccourci que tu dois connaître, tu peux remplacer :
    play war yabe -o yabe_war
    cd yabe_war
    jar -cvf yabe.war *
    par :
    play war yabe -o yabe_war –zip

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

*

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.