Archive

Archive for the ‘Java’ Category

Stateless is priceless : la vidéo

Les vidéos de la session que j’ai eu l’honneur de présenter au Ch’ti JUG sur le thême des applications Web sans session sont maintenant disponibles sur Parleys: partie 1 et partie 2.

Grand merci à Loïc pour le montage.

Publicités
Étiquettes : , ,

Plusieurs instances de Tomcat sur Ubuntu

18 janvier 2012 6 commentaires

Pourquoi plusieurs instances ?

  • Pour pouvoir déployer plusieurs applications partageant les même adresses, sur plusieurs virtuals hosts, sans pour autant gérer ces virtuals hosts dans Tomcat
  • Pour pouvoir arrêter / démarrer les JVM de manière indépendante
  • Pouvoir utiliser des environnements Java différents (version de la JVM, librairies partagées, propriétés système, …)
  • Isoler complètement les applications, une fuite mémoire sur l’une ne peut pas impacter l’autre.

Variables d’environnement.

Tomcat utilise deux variables d’environnement :

  • CATALINA_HOME pointe vers le répertoire d’installation de Tomcat
  • CATALINA_BASE est utilisée pour tous les chemins relatifs : configuration, applications.

Si CATALINA_BASE n’est pas précisée, c’est CATALINA_HOME qui est utilisée.

Mise en oeuvre avec Ubuntu

  • Installer tomcat et OpenJDK et le paquet « tomcat6-user » qui permet de créer d’autres instances tomcat :
tom@ubuntu:~$ sudo apt-get install -y tomcat6 openjdk-6-jdk tomcat6-user
  • Pour ne pas créer de confusion, désactiver l’instance principale de tomcat :
tom@ubuntu:~$ sudo update-rc.d -f tomcat6 remove
tom@ubuntu:~$ sudo service tomcat6 stop
  • Créer une nouvelle instance, nommée tomcat6-www, dans notre exemple :
tom@ubuntu:~$ cd /opt
tom@ubuntu:/opt$ sudo tomcat6-instance-create -p 8081 -c 8006 tomcat6-www
tom@ubuntu:/opt$ sudo mkdir tomcat6-www/conf/policy.d
tom@ubuntu:/opt$ sudo touch tomcat6-www/conf/policy.d/empty.policy
tom@ubuntu:/opt$ sudo chown -R tomcat6:tomcat6 tomcat6-www
tom@ubuntu:/opt$ cd /etc/init.d/
tom@ubuntu:/etc/init.d$ sudo cp tomcat6 tomcat6-www

8081 est le port http et 8006 est port d’arrêt.

  • Editer le script de lancement /etc/init.d/tomcat6-www, y changer les variables suivantes :
NAME=tomcat6-www
JVM_TMP=/tmp/tomcat6-www-tmp
DEFAULT=/etc/default/tomcat6
CATALINA_HOME=/usr/share/tomcat6
CATALINA_BASE=/opt/tomcat6-www
  • Activer le démarrage automatique, démarrer l’instance :
tom@ubuntu:/etc/init.d$ sudo update-rc.d tomcat6-www defaults 90
tom@ubuntu:/etc/init.d$ sudo service tomcat6-www start
Étiquettes : ,

Mon premier Devoxx

19 novembre 2011 2 commentaires

J’ai enfin eu l’occasion de participer à mon premier Devoxx cette semaine, encore un peu à chaud voici ce qui m’a marqué :

Keynote de S.Janssen

La Keynote a lieu dans une des (la ?) plus grandes salles et elle est retransmise en live dans les autres salles.
Tout l’esprit de Devoxx est représenté par Stephan : fun et sérieux.
Il introduit les trois jours de conférence et termine sur l’annonce de DevoxxFrance via un « One more thing » et une vidéo bien menée.
Un grand moment pour les Français qui attendaient enfin une belle conférence de ce type en France.

Oracle vs Google

Assurément compétents, les speakers de Oracle m’ont appris beaucoup de choses sur l’intégration des closures et sur Jigsaw pour Java 8 … mais que c’est dur de rester accroché, des slides chargés, pas de live coding, des speakers un peu monocordes.
D’un autre coté, que ce soit sur Android ou HTML5, Google a sorti l’artillerie lourde avec beaucoup de conférences par des speakers de grande qualité.
Des bons speakers, du code et/ou des démos, c’est ce que les gens attendent. Même en restant sur le thème Java SE, Josh Bloch arrive à avoir une présentation sympa et accrocheuse .

BOF Java EE

J’ai participé au BOF animé par Alexis Moussine-Pouchkine sur les JSR relatives à Java EE 7.
C’était assez interessant de voir de nombreux « specs leaders » répondre à des questions très pointues et débattre entre eux.
Devoxx est une énorme conférence mais les intervenants sont très accessibles.

BOF JUG

Je crois que j’ai oublié de vous le dire mais j’ai intégré l’équipe d’organisation du Ch’ti JUG il y a quelques mois.
J’ai donc participé avec plaisir à cette rencontre des JUG Leaders. Des représentants d’Oracle étaient présents ainsi que de nombreux JUG Leaders des capitales européennes et d’autres continents (Maroc, Egypte, Brésil, USA, ..)
Oracle semble apprendre vite et faire beaucoup d’efforts en direction des JUGs, bonne nouvelle.
Une large partie de la session a été consacrée au programme « Adopt a JSR« , le JCP est preneur de retour d’information de la part de développeurs et encourage la communauté à s’investir dans les JSR.

Matt Raible

Matt Raible est un spécialiste des frameworks Web et nous a présenté la session la plus hallucinante de ces trois jours, .
Il a aimé venir à Devoxx l’année dernière et c’est imposé un challenge de taille : apprendre Scala pour en faire une session à Devoxx 2011 !
Comme le garçon n’a pas froid aux yeux, il empile de nombreuses technologies dans sa R&D : Play!, CoffeeScript, Scalate, Jade et pour finir PhoneGap car tout ca tourne dans Safari Mobile.
Le tout est présenté avec beaucoup d’humour, à la fin de la session il présente une vidéo qui retrace toute cette aventure avec trois sessions de test en extérieur.

Ceylon

Dernière session de la conférence : présentation du langage Ceylon par Emmanuel Bernard et Stephane Epardaud.
Ceylon est un langage statique pour la JVM qui vient apporter des solutions à certains problèmes rencontrés avec Java.
Par rapport à Java, la syntaxe n’est vraiment pas chocante, le développeur Java ne sera pas chamboullé.
Parmis les fonctionnalités proposées, j’ai retenu :

  • Une protection contre les NullPointerException par le compilateur.
  • L’utilisation naturelle d’objects immuables.
  • Le type Union qui permet de combiner plusieurs interfaces.
  • Les propriétés : les accesseurs sont présents par défaut
  • … et plein d’autres choses sympas.

Pendant la session, Emmanuel annonce que le projet a maintenant un site web et a puplié son code sur Github.
Je n’ai pas encore regardé attentivement les autres langages (Kotlin et Fantom) mais celui ci me plait bien.

Un dernier mot : Harcelez votre manager, prenez des congés, changez de boite  ou devenez indépendant mais allez à ces conférences

Étiquettes : , ,

Devoxx France à Paris en Avril 2012

16 novembre 2011 1 commentaire

Ce matin lors de la Keynote d’ouverture de Devoxx, nous avons eu le droit à un « One more thing » : la projection d’une vidéo annonçant l’organisation d’une édition Française de la conférence Devoxx.

C’est une excellente nouvelle, car aucune conférence de ce gabarit n’existe pour les développeurs Java francophones.

Grand bravo et bon courage à l’équipe du Paris JUG qui prend en charge cette organisation.

Rendez vous sur le site de DevooxFrance pour plus d’infos.

 

Étiquettes : ,

Automatiser les changements de schéma de base de données avec Flyway

5 juillet 2011 1 commentaire

J’ai été intrigué par le système de mise à jour de base de données de l’appliation Sonar. Quand vous installez une nouvelle version, l’application vous indique que votre base de données est en version x et qu’il faut la migrer en version y. Un clic et un peu de patience plus tard, la mise à jour de la base de données est effective.

J’ai également rencontré le même système de mise à jour pour le portail projet Redmine. Le point commun entre ces deux outils : ils sont basés sur Ruby On Rails, le fameux framework intégré de développement web basé sur le langage Ruby.

Ruby On Rail intègre un outil nommé Migrations qui permet en effet de spécifier des migrations unitaires de base de données, le framework permettant de les appliquer de manière incrémentale.

En Java, les outils de mapping objet/relationnel disposent de fonctions similaires. Par exemple Hibernate sait générer le modèle de base de donnée (DDL) qui correspond à vos entités JPA . Il sait également mettre à jour une base de données pour lui ajouter des éléments (propriété hibernate.hbm2ddl.auto). Dans de nombreux cas c’est suffisant. Cependant certains cas ne sont pas gérés, par exemple le changement de type d’une colonne ou la suppression de colonnes.

J’ai récemment rencontré un cas ou nous avions besoin d’aller plus loin, en effet les applications traversent de nombreux environnements de qualification avant d’arriver en production. Dans ce cas les opérations manuelles sont à éviter le plus possible. J’ai donc recherché un outil équivalent à Migrations mais en Java.

J’ai trouvé mon bonheur avec Flyway, une librairie OpenSource (License Apache 2.0) qui permet d’automatiser les changements de schéma. L’idée est simple :

  • Flyway stocke dans une table (SCHEMA_VERSION) un journal des scripts déja executés sur cette base de données
  • L’application embarque les scripts SQL suivant une convention de nommage
  • Au démarrage de l’application, Flyway calcule l’écart entre la table SCHEMA_VERSION et les scripts présents dans votre application et applique les nouveaux scripts
De plus il est possible d’écrire les scripts en SQL mais aussi de les écrire en Java pour les opérations plus complexes. Par exemple pour adapter les données au nouveau schéma.
Pour intégrer flyway dans votre application, il est nécessaire d’ajouter la librairie flyway-core qui s’appuie sur spring-jdbc.
Pour les utilisateurs de maven, ajouter cette dépendance dans votre pom :
<!-- Migrations de schémas SQL -->
<dependency>
  <groupId>com.googlecode.flyway</groupId>
  <artifactId>flyway-core</artifactId>
  <version>1.4</version>
</dependency>

Les fichiers SQL doivent se trouver dans le classpath de l’application à l’exécution, dans un package db.migration. Les utilisateurs de maven les placeront donc dans src/main/resources/db/migration . Les fichiers doivent être nommés sur le pattern suivant : VX_yyy_zzz.sql, X représentant le numéro de version et yyy_zzz étant un libellé de version. Par exemple : V1_initialize.sql ou V6_parameter_table.sql .

Pour lancer la migration, une API est disponible. Toutes les opérations sont disponibles dans la classe Flyway, voici un exemple d’utilisation :

Flyway flyway = new Flyway();
flyway.setDataSource(dataSource);
flyway.migrate();

L’intégration avec Spring est soignée, il suffit de déclarer le bean avec une méthode d’initialisation

<bean id="flyway" class="com.googlecode.flyway.core.Flyway" init-method="migrate">
  <property name="dataSource" ref="dataSource"/>
</bean>
Pour écrire un script de migration en Java, la encore il faut suivre une convention de nommage. Les classes  doivent se trouver dans le package db.migration et suivre le même pattern de nommage que les scripts. Par exemple : V4_settings_migration.java. Les classes doivent également implémenter l’interface JavaMigration.
Par exemple :
package db.migration;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.jdbc.core.JdbcTemplate;

import com.googlecode.flyway.core.migration.java.JavaMigration;

public class V54_sample_migration implements JavaMigration {

	private Logger logger = LoggerFactory.getLogger(this.getClass());

	@Override
	public void migrate(JdbcTemplate jdbcTemplate) throws Exception {
		logger.info("V54_sample_migration STARTING");
		int countOfActorsNamedJoe = jdbcTemplate.queryForInt("select count(0) from actors where first_name = ?", "Joe");
		jdbcTemplate.update("update stats set count = ? where first_name = ?", countOfActorsNamedJoe, "Joe");
		logger.info("V54_sample_migration ENDED");
	}
}

Toutes les conventions de nommage sont configurables (package de base, préfixe et suffixe des scripts, …) . Pour assurer les évolutions d’un modèle de données existant, il est nécessaire d’ajuster la propriété disableInitCheck à true dans le cas contraire Flyway déclenche une exception.

Bref un outil simple et extrêmement pratique pour rendre le déploiement de vos applications un peu plus fluide.

Étiquettes : ,

HTTP sans session : pourquoi et comment ?

Voici une présentation rapide sur un sujet assez populaire en ce moment : Les applications Web sans session coté serveur d’application.

J’ai écrit cette présentation avec mon collègue Guillaume, nous y revenons sur les principes basiques de HTTP, à quoi sert une session coté serveur et comment s’en passer.

Étiquettes : ,

CloudBees au Chti’JUG chez norsys le 28 Juin 2011

Norsys accueille pour la seconde fois le Chti’JUG dans ces locaux à l’occasion de la session consacrée à CloudBees. Ce sera l’occasion d’en savoir plus sur les offres CloudBees DEV@Cloud et RUN@Cloud.

DEV@Cloud est une offre d’hébergement des sources et d’intégration continue à l’aide de Jenkins. Kohsuke Kawaguchi le papa de Jenkins travaille d’ailleurs pour CloudBees.

RUN@Cloud est une plateforme élastique d’hébergement Java EE (Tomcat + MySQL).

Cette session aura lieu à l’occasion du 7eme campus d’été norsys, un temps fort de formations et de conférences

Rendez vous le 28 Juin !

Inscriptions ici.

 

 

Étiquettes :