WebEra

Migration de site web java sur app engine avec jpa + datastores ( mysql => BigTable)

Pour un projet noté de cours en JAVA nous devions faire un site en JAVA / Servlet avec des JPA, rien de bien compliqués sauf quand notre seconde partie du projet nous demande de le faire tourner sur la technologie App Engine de Google (https://developers.google.com/appengine/ ), en effet app engine ne supporte pas les Servlet 3 et on ne peut pas ce connecté à une base de données externe a celle fournis par google sans payer, donc il va falloir revoir notre code !

Part 1 : Installation des composants nécessaire

Avant de pouvoir créer ou migrer notre site il va falloir installer les composants nécessaires au bon fonctionnement.

Le support officiel étant Eclipse toute ma démarche sera basé dessus.

-Téléchargement du sdk App Engine google : appengine-java-sdk.zip

On en aura besoin pour débugger notre application en cas de fail build / crash

-Téléchargement du plugin Eclipse :
-Sélectionnez le menu Help (Aide) > Install New Software… (Installation d’un nouveau logiciel)
-Dans la zone de texte Work with (Utiliser), entrez
http://dl.google.com/eclipse/plugin/3.
-Cliquez sur le bouton Add… (Ajouter). Dans la boîte de dialogue qui s’affiche, cliquez sur OK (laissez vide la zone devant contenir le nom, qui va être récupéré à partir du site de mise à jour.
-Sélectionnez Google App Engine Java SDK » (SDK Java Google App Engine
-Installation et reboot d’eclispe

Part 2 : Création / migration de notre site web actuel

Ici deux choix possibles, soit vous voulez garder votre ancien projet et en faire un nouveau rien que pour app engine soit vous mettez à jour votre projet sur app engine .

Création d’un nouveau projet :

Dans Eclipse il suffit de faire, File => New => Other => Chercher tout en bas Google => Web application Project

Mettre le nom du nouveau projet ainsi que le chemin du package (remettez l’ancien chemin pour aller pus vite dans la migration plus tard)

Dans les options de Google SDK, décochez la case « Use Google Web Toolkit », assurez-vous que la case « Use Google App Engine » soit coché par contre.

Puis cliquez sur Finish.

Mettre à jour son projet :

Faite un clic droit sur le dossier du projet, puis aller dans : Properties => Google => App Engine => Coché la case « Use Google App Engine »

Puis cliquez sur Ok, votre projet a normalement été mis à jour avec de nouvelles lib

A partir d’ici, dans les deux cas vous devez avoir les libs dans votre projet et un nouveau menu « Google » en faisant un cli droit sur le dossier du projet .

La configuration de l’application est la même a partir d’ici pour les deux cas.

Configuration du projet :

Il faut bien sur s’etre enregistrer sur appengine.com pour créer une nouvelle application comme suit :

Une fois ceci fait vous aller être redirigé sur un dashboard, nous y reviendrons plus tard.

Nous revenons à notre projet sous Eclipse,un clic droit sur le dossier du projet puis : Google => App Engine settings

Nous allons modifier la partie « deployment », comme donner avant votre application id est le nom que vous avez donné dans la partie « Application identifier » vue plus tôt, la Version quant à elle dépendra de vous, vous pouvez l’incrémenter à chaque modif ou écraser la version a chaque nouvelle build.

Part 3 : Test de déploiement de l’application

Si vous avez créé un nouveau projet, il y a donc un servlet de test par défaut, pour voir si votre projet marche, il vous suffit de faire un clic droit => Google=>Deploy to App Engine

Apres un certain temps vous devriez avoir un message qui vous indique que cela a bien été déployé.

Si vous allez sur votre URL du site vous devriez tomber sur quelque chose de ce genre :

Passons maintenant au plus « dur » la migration à proprement dite de nos anciens servlet / jpa.

Comme dit en introduction Google App Engine ne supporte pas les Servlet 3 donc dite adieux à vos annotations du genre :

[html] @WebServlet("/auth/addIntervention")
public class AddCampusServlet extends HttpServlet {
[/html]

La solution consiste donc à mettre toutes vos redirections d’url dans le web.xml.
Voici un exemple :

[html] <servlet>
<servlet-name>AddInterventionServlet</servlet-name>
<servlet-class>fr.webera.notetonsta.servlet.AddInterventionServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>AddInterventionServlet</servlet-name>
<url-pattern>/auth/addIntervention</url-pattern>
</servlet-mapping>
[/html]

Passons à la chose la moins marrante, la modification de nos JPA, Google nous fournis son moteur de base de données ( BigTable) qui est une architecture du type NoSQL, il va donc falloir faire des sacrifices dans votre modèle :

Dite adieux à vos belles relations bi-directionnelles:
-Pas de relation oneToMany
-Pas de fonction AVG() ou autres dérivé
-Beaucoup d’autre que vous pouvez voir sur la docs

Pour prendre en compte la base de données Google il faut changer notre persistence.xml :

[html] <?xml version="1.0" encoding="UTF-8" ?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd" version="1.0">
<persistence-unit name="transactions-optional">
<provider>org.datanucleus.api.jpa.PersistenceProviderImpl</provider>
<properties>
<property name="datanucleus.NontransactionalRead" value="true"/>
<property name="datanucleus.NontransactionalWrite" value="true"/>
<property name="datanucleus.ConnectionURL" value="appengine"/>
<property name="datanucleus.singletonEMFForName" value="true"/>
</properties>
</persistence-unit>
</persistence>
[/html]

N’oubliez pas de changer votre nom d’unit pour votre manager .

Des modifications sont aussi à prévoir au niveau des id / primary key pour les entity

Pour un id de type « chiffre »

[html] @Id @GeneratedValue(strategy=GenerationType.IDENTITY)
private Long id;
[/html]

D’autre probléme peuvent ce pauser, j’ai par exemple eu un « Object Manager closed » sans aucune info dans une de mes jpa ou je retournre une List<Campus>, la solution a était de rajouter tout simplement la taille de la list :

[html] List<Campus> campus = query.getResultList();
campus.size();
return campus;
[/html]

Toujours utiliser java.util.Date est pas java.sql.Date

Parfois vous faite un test de déploiement ou de compilation eclispe peut vous retourner cette erreur :

[html] Another transaction by user anthony.dubuissez is already in progress for app: s~notetonsta-76724, version: 2. That user can undo the transaction with "appcfg rollback".
[/html]

Pour résoudre ce problème et pouvoir recompiler il suffit de lancer appcfg :

[html] cd C:\appengine-java-sdk-1.6.3.1\bin
C:\appengine-java-sdk-1.6.3.1\bin>appcfg.cmd rollback "C:\Users\Era\workspace\NoteTonSta_App_engine\war"
[/html]

Si vous avez des questions ou des ajouts/modifications a faire n’hésitez pas !

Quitter la version mobile