Affichage des articles dont le libellé est J2EE. Afficher tous les articles
Affichage des articles dont le libellé est J2EE. Afficher tous les articles

vendredi 15 mai 2015

Intégration continue avec Jenkins / Maven / JUnit / JMeter / PMD

Intégration continue avec Jenkins / Maven / JUnit / JMeter / PMD

Le pourquoi: Assurer l’intégration, la performance, et la qualité du code avec les outils suivants : 

Jenkins (un "fork" open source de hudson / outil d'intégration continue).
JUnit (tests unitaires).
JMeter (test de charges).
PMD (la définition de nombreux règles qui assurent la qualité de code).
Maven (La gestion des dépendances et automatisation de la production).

A chaque "build" l'application est compilée, analysée ,testée (JUnit), déployée et re-testée (JMeter).


Les résultats des analyses sont disponible juste après :



PMD :
JMeter :
JUnit :
Maven permet d'automatiser le tout en définissant un ou plusieurs fichiers POM (pom.xml) qui contient le nom du projet, le numéro de version, les dépendances vers d'autres projets, les bibliothèques nécessaires à la compilation, les noms des contributeurs etc.

 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.test</groupId>
<artifactId>spring</artifactId>
<version>0.0.2-SNAPSHOT</version>
<packaging>war</packaging>
<name>test</name>

<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.1.6.RELEASE</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
</dependencies>

<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<configuration>
<webXml>WebContent\WEB-INF\web.xml</webXml>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat6-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<url>http://localhost:8090/manager</url>
<server>TomcatServer</server>
<path>/SpringMavenCLITest</path>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-pmd-plugin</artifactId>
<version>3.0.1</version>
<configuration>
<targetJdk>1.6</targetJdk>
<linkXref>false</linkXref>
<failOnViolation>false</failOnViolation>
<failurePriority>1</failurePriority>
</configuration>
<executions>
<execution>
<goals>
<goal>check</goal>
<goal>cpd-check</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>com.lazerycode.jmeter</groupId>
<artifactId>jmeter-maven-plugin</artifactId>
<version>1.10.1</version>
<executions>
<execution>
<id>jmeter-tests</id>
<phase>verify</phase>
<goals>
<goal>jmeter</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.11</version>
<dependencies>
<dependency>
<groupId>org.apache.maven.surefire</groupId>
<artifactId>surefire-junit47</artifactId>
<version>2.12</version>
</dependency>
</dependencies>
<configuration>
<includes>
<include>**/*.class</include>
</includes>
</configuration>
</plugin>
</plugins>
</build>
<reporting>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jxr-plugin</artifactId>
<version>2.3</version>
</plugin>

<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-pmd-plugin</artifactId>
<version>3.0.1</version>
<configuration>
<linkXRef>false</linkXRef>
<targetJdk>1.6</targetJdk>
<rulesets>
<ruleset>/rulesets/basic.xml</ruleset>
</rulesets>
</configuration>
</plugin>
</plugins>
</reporting>

</project>



 Pour finir il faut configurer jenkins pour démarrer notre intégration continue.









lundi 27 avril 2015

Road to the Cloud (1) : NoSQL / Hibernate OGM (Object/Grid Mapper)

Road to the Cloud (1) : NoSQL / Hibernate OGM (Object/Grid Mapper)


Le 2015-02-27 a connu le lancement de la version stable du framework Hibernate pour les bases de données NoSQL appelé Hibernate OGM le but est de porté la facilité de développement JPA au monde NoSQL ainsi les développeurs familiarisés avec JPA n'aurons aucun problème à changer de cape.

Le pourquoi : une scalabilité horizontale et évolutivité.


- Un schéma flexible capable d'accepter les changements plus facilement (Evolution).
- Un système facilement distribué sur plusieurs serveurs. (le besoin supplémentaire en stockage ou en montée en charge se traduit simplement par l’ajout de nouveaux serveurs).



Donc si vous visez de porter votre application vers le cloud et d'avoir des milliers d'utilisateurs (Données) a moindre coût le choix du NoSQL est obligatoire.

L'architecture Hibernate OGM permet l'utilisation des requêtes JP-QL en les transformant en requêtes DataStore donc le développeur n'aura pas a écrire des requête NoSQL, donc même réutiliser l'existant.



La définition des beans avec annotations JPA/EJB3 reste la même sauf l'introduction de hibernate search qui pourra aussi être un autre moyen de recherche.


Exemple de requête JP-QL simple : 

                EntityManager emSearch = emf.createEntityManager();
Query query = emSearch.createQuery("from Data d where d.name like :name")
.setParameter("name", "XXX%");

Exemples de requête DataStore Ex: MongoDB: 

- Update du montant :
db.Data.update({ "_id" : NumberLong(351) },{ "$set" : { "montant" : "1" } },false, false )

- Delete par ID :
db.Data.remove({ "_id" : NumberLong(143) })

- Recherche Par ID : 
db.Data.find({ "_id" : NumberLong(143) })


- Insert des données :
db.Data.insert({"_id" : NumberLong(131300),"montant" : "0.16364626911022928101857587535050697624683380126953125","description" : "Description2134956245","name" : "Name170565634","date" : ISODate("2015-04-17T10:36:46.583Z"),"parent_id" : NumberLong(13118),"rows" : [NumberLong(13123),NumberLong(13122),NumberLong(13125),NumberLong(13124),NumberLong(13127),NumberLong(13126),NumberLong(13129),NumberLong(13128),NumberLong(13119),NumberLong(13121),NumberLong(13120)]})

- Recherche par champs Name :
db.Data.find({ '$query' : { "name" : "Name-414524582" ,  "_id" : NumberLong(13) }})

- Recherche ID >13 et ID < 130  :
db.Data.find({ '$query' : { "_id" : { $gt: NumberLong(13), $lt: NumberLong(130) } }})

- Recherche par objet incorporé :
db.Data.find({"location.y" : "Y-400967006"} )


Les bases de données suivantes sont supportées : couchDb, mongodb, ehcache, infinispan, neo4j.

Pour l'exemple nous allons utilisé la base données MongoDB :


Pour la visualisation les données le plugin eclipse MonjaDB :


Le Fichier Persistence.xml : 



Télécharger l'exemple : Test APP