Java, SOA, Architecture & Methodes agiles par Thomas Recloux

Sortie de Subversion 1.5 et Trac 1.1

Publié le 3 juillet 2008 par Thomas Recloux

Subversion, le populaire gestionnaire de sources et Trac, le wiki / gestionnaire de taches ont chacun publié une nouvelle version majeure.

Pour Subversion, c’est la version 1.5.0 qui vient d’être annoncée, après de nombreuses versions candidates (release candidate). La principale nouveauté est le “merge tracking”, les reports entre différentes branches en sont grandement simplifiés. Il faut avouer que le système précédent imposait une discipline forte dans les commentaires des merge et une gymnastique intellectuelle un peu compliquée.

Je vous encourage à consulter les notes de version pour plus de détails.

La version adaptée de TortoiseSVN, le client visuel pour Windows est également publiée.

L’équipe Trac a elle annoncée la version 0.11, la grosse nouveauté est la possibilité de personnaliser le workflow des taches pour l’adapter à votre organisation. A noter que le plugin d’administration WebMin est maintenant inclus.

Une version francisée est disponible chez trac-hacks

J’attends impatiemment les versions suivantes qui vont amener l’internationalisation et la gestion de plusieurs projets dans un seul référentiel.

Trac est très lié à Subversion, il permet notamment de lier les modifications du code aux taches référencées dans trac.

Formation Scrum par Jeff Sutherland

Publié le 3 juillet 2008 par Thomas Recloux

Je viens de suivre la formation Scrum donnée par Jeff Sutherland et Xebia.

Nous étions 30 et je pense que tout le monde connaissait déjà les grands principes des méthodes agiles et de Scum, Jeff a donc pu passer beaucoup de temps à nous partager son énorme expérience, à nous décrire le fonctionnement de sa société ainsi qu’a répondre aux nombreuses questions.

Jeff a énormément de charisme et présente beaucoup de données sur la productivité des équipes, il doit être capable de convaincre n’importe quel DSI :-)

Si vous êtes intéréssés par Scrum ou que vous désirez améliorer votre pratique, je vous conseille vivement cette formation/certification ScumMaster.

De mon coté ça n’a fait que décupler mon désir de travailler sur des projets agiles, objectif numéro un de ce deuxième semestre !

Campus d’été Norsys et Atelier RIA

Publié le 3 juillet 2008 par Thomas Recloux

Il est temps de poster de nouveaux articles, j’ai un peu délaissé ce blog ces dernières semaines pour tout un tas de bonnes excuses, notamment 4 semaines de congés en famille au bout du monde.

En ce moment se déroule le campus d’été de Norsys, SSII qui m’emploie depuis 8 ans. A cette occasion j’ai animé une formation de trois jours, j’ai décidé de consacrer deux jours à un atelier de découverte de frameworks RIA et un jour au profling d’applications Web à l’aide OpenSTA et JProfiler.

Les technologies choisies par les 4 groupes ont étés : Wicket, GWT, Flex et JSF/MyFaces avec Seam.

Chaque groupe avait une backlog de fonctionnalités à implémenter

Mon ressenti à l’issu des démonstrations de chaque équipe est que GWT et Flex ont permis aux équipes de réaliser le plus de fonctionnalités tout en montrant un grand potentiel.

Les deux plateformes ont des points communs :

  • Capacité à gérer l’état coté client et donc utiliser des services sans état coté serveur, c’est un énorme gain pour la scalabilité des applications.
  • Utilisation d’un langage de développement intermédiaire qui est projeté vers une plate-forme cible ( Java -> DHTML/Ajax pour GWT, MXML/ActionScript -> Flash pour Flex)
  • Capacité à développer en mode visuel (Flex Builder ou GWTDesigner)

Elles s’appuient tout de même sur des fondations fort différentes :

  • Le modèle utilisé par GWT est beaucoup plus ouvert que celui d’adobe : la plate-forme flash reste ultra dépendante d’adobe et certaines plate-formes ne sont pas (encore) couvertes (IPhone par exemple).
  • Flex propose toutes les animations vectorielles de Flash et dans certains contextes ça peut faire la différence alors que GWT ne modifie pas “l’expérience utilisateur” par rapport aux applications Web classiques

A suivre, la formation Scrum par Jeff Sutherland.

Xebia Poker Ended

Publié le 12 avril 2008 par Thomas Recloux

Le tournoi de poker organisé par Xebia a eu lieu jeudi soir, comme j’ai fini 8eme du quizz, j’ai pu y participer.

L’ambiance était très sympa, bravo Xebia pour l’idée originale et la réalisation parfaite.

C’était mon premier tournoi du genre et seulement ma troisième partie de poker, mes ambitions étaient forcement très limitées. J’ai eu un jeu très (trop) prudent et j’ai quitté le tournoi en 11eme position.

la soirée m’a donné l’occasion de discuter avec le touilleur himself, paré d’un tee shirt aux couleurs de son blog ainsi qu’avec quelques xebia boys. Tous gardent un grand souvenir de leur formation à Scrum par Jeff Sutherland. Vivement le mois de Juin qui j’y goute à mon tour.

Bravo au vainqueur, Sébastien et bon voyage à San Francisco.

Maven 1 et continuum

Publié le 24 mars 2008 par Thomas Recloux

Quelques astuces en vrac pour intégrer un projet maven1 (oui, il y en a encore :-) ) dans continuum.

  • Continuum ne supporte pas l’import de POM qui étendent un autre POM. la solution est de créer un POM minimal dédié à cet import et qui indique l’URL du SCM. Ensuite Continuum va déclencher un “checkout” à partir du SCM et récupérer le véritable POM.
  • Sous windows, le script bat de maven ne permet pas à continuum de récupérer le code de sortie et donc de savoir si le build est un succès. La solution est de récupérer la dernière version du script maven.bat et d’affecter la valeur “on” à la variable d’environnement “MAVEN_TERMINATE_CMD”. Il est possible d’affecter la variable d’environnement à l’aide des profils continuum.

GWT : en route vers la 1.5

Publié le 8 mars 2008 par Thomas Recloux

Bruce Johnson, le papa de GWT a annoncé la disponibilité de la version 1.5M1 de GWT.

La version 1.5 est largement attendue par la communauté GWT car elle apporte le support de Java 5 avec les annotations, generics, autoboxing, enums, ….

Attention, ce n’est pas une version stable, elle n’est pas documentée et ne doit donc pas être utilisée serieusement.

Foreach a des fuites

Publié le 8 mars 2008 par Thomas Recloux

Je prépare actuellement une formation au profiling avec JProfiler, j’ai choisi de travailler à partir de l’application Jpetstore, application exemple fournie avec le framework spring. Le tout étant déployé dans un conteneur Tomcat 5.5.25

J’ai inséré dans cette application quelques problèmes à corriger par les stagiaires et notamment une fuite mémoire, j’ai eu la surprise en contrôlant l’efficacité de ma fuite de constater que d’autres fuites étaient présentes.

En effet, certains objets du domaine restent présents dans la mémoire de la JVM et ne sont pas récupérés par le garbage collector . L’application utilise la librairie de tag (taglib) JSTL via l’implémentation de Jakarta, c’est un des tags de cette librairie, le tag forEach qui garde des références vers les objets de la liste parcourue.

En creusant un peu plus, le problème est identifié depuis longtemps dans au sein du projet taglib et au sein du projet tomcat.

En fait le composant taglib présente une méthode qui libère ses données, mais elle n’est pas appelée par le moteur de JSP de Tomcat (Jasper), les deux équipes semblent se renvoyer la balle en expliquant qu’ils implémentent bien leurs spécifications respectives. Le problème est censé disparaître en désactivant le pooling des tags dans tomcat, mais je n’ai pas pu constater d’amélioration.

Tout cela est bien décevant de la part de ces deux projets, je vais essayer de mesurer prochainement le comportement de la fuite dans le temps, est ce que le nombre références augmente ou au contraire plafonne ?.

Log4J : données contextuelles

Publié le 5 mars 2008 par Thomas Recloux

Log4J est un composant de Log qui s’est imposé de manière universelle dans le monde Java, je l’utilise depuis mon premier projet Java en 2001 (oh my god).

Cela fait quand même du bien de se replonger dans sa documentation de temps en temps, j’ai cette fois ci été attiré par les composants qui permettent d’ajouter des données contextuelles aux traces.

En effet, le besoin de rajouter ce type de données pour faciliter la corrections de bugs est récurent, ces données peuvent aller de l’identifiant de l’utilisateur au processus applicatif en cours en passant par la version de l’application, les besoins et solutions sont variés.

Log4J offre deux composants qui remplissent ce rôle de manière élégante :

Le NDC est une pile qui permet de stocker des messages contextuels, ces messages sont stockés par Thread et sont donc (par exemple) partagés durant l’exécution d’une requête HTTP par un moteur de servlet.

La méthode push permet de rajouter un message en haut de la pile, la méthode pop permet de dépiler d’un niveau.

Pour ajouter le contenu du NDC dans un PatternLayout, il faut ajouter la variable %x au pattern.

Par exemple, cette séquence d’appels :

Logger logger = Logger.getLogger(“foo”);
logger.info(“homepage”);
NDC.push(“ClientID : “ + clientId);
logger.info(“client identifié”);
NDC.push(“Process : Commande de chequier”);
logger.info(“Nb de chequiers commandés: “ + nbChequiers);

associée à ce pattern Log4J :

log4j.appender.STDOUT.layout.ConversionPattern=%-5p %c [%x] %m%n

génère la sortie suivante :


INFO  foo [] homepage
INFO  foo [ClientID : 123456] client identifié
INFO  foo [ClientID : 123456 Process : Commande de chequier] Nb de chequiers
  commandés: 2
INFO  foo [ClientID : 123456 Process : Demande de RIB] Code IBAN : 441 45645
  6456 45645645 456

A l’instar du NDC, le MDC est un espace de stockage propre à un Thread, cependant cet espace de stockage est réalisé à l’aide d’une Map et non pas d’une pile. Il permet donc d’associer des messages à des clefs et de spécifier dans le pattern quelles clefs sont à afficher.

Par exemple, cette séquence d’appels :

logger.info(“homepage”);
MDC.put(“ClientID”, clientId);
logger.info(“client identifié”);
MDC.put(“Process”,“Commande de chequier”);
logger.info(“Nb de chequiers commandés: “ + nbChequiers);
MDC.put(“Process”,“Demande de RIB”);
logger.info(“Code IBAN : “ + codeIBAN);

Associée au pattern :

log4j.appender.STDOUT.layout.ConversionPattern=%-5p %c
    [Client:%X{ClientID}] [Process:%X{Process}] %m%n

Produira ces traces :

INFO  foo [Client:123456] [Process:] client identifié
INFO  foo [Client:123456] [Process:Commande de
     chequier] Nb de chequiers commandés: 2
INFO  foo [Client:123456] [Process:Demande de RIB] Code IBAN :
     441 456456456 45645645 456

Optimisation : analyse des performances avec un profiler

Publié le 26 février 2008 par Thomas Recloux

Au grès des missions et des projets, j’ai plusieurs fois eu l’occasion d’optimiser des applications Java / J2EE.

Pour optimiser une application, il faut détecter les éléments consommateurs à l’aide d’un profiler. Le profiler est un logiciel qui se connecte à la machine virtuelle et récupère des informations sur les enchainements de méthodes et les allocations d’objets.

Cela permet de détecter quelles méthodes prennent du temps soit en consommant de la CPU soit en attendant un traitement distant (requête SQL ou LDAP, Appel d’un EJB ou d’un Web Service, ….).

Les profilers permettent d’avoir une vue arborescente des piles d’appel, par exemple quelles méthodes sont déclenchées par une requête HTTP ou quel composant consomme le plus de temps sur cette requête

Pour alimenter le profiler en données à analyser, il faut faire travailler les applications que l’on veut optimiser. L’idéal est de définir des scénarios d’utilisation de l’application à partir de statistiques de production, afin de reproduire les actions les plus utilisées.

Pour automatiser ces scénarios, des outils comme OpenSTA, The Grinder ou JMeter sont très adaptés.

Une fois le profiler mis en place et les scénarios automatisés, je fonctionne de manière itérative en effectuant les actions suivantes :

  • Lancement du tir en utilisant les scénarios automatisés
  • Analyse des résultats
  • Correction / tests unitaires / déploiement

La présence de tests unitaires et de tests fonctionnels permet d’accélérer la phase de corrections et de déployer plus rapidement les corrections en production en s’assurant de la non régression.

Je pense que des interventions de ce type sont nécessaires sur toutes les applications ou groupes d’applications dont le niveau de performance est important et sont obligatoires quand on constate que l’infrastructure de production est trop sollicitée.

Les profilers phares du marché sont :

Ouvrir un AS/400 vers le système d’information

Publié le 22 février 2008 par Thomas Recloux

La plupart des SI ont un passé et disposent de systèmes anciens dits “legacy”, ces systèmes hébergent encore de nombreuses applications et leur remplacement ne peut pas se faire du jour au lendemain.

Il est donc important de pouvoir valoriser ces systèmes et de les intégrer dans des architectures à base de service dites SOA.

Pour les systèmes AS/400, OS/400, i5/OS, iseries ou System i (rayez les mentions inutiles), voici les mécanismes que j’ai mis en oeuvre:

  • Exposition de services de l’AS/400

IBM publie en OpenSource une librairie nommée JT400 qui permet de se connecter à l’AS400 et entre autre de faire du RPC en lançant les programmes à distance. La connexion se fait en TCP/IP et cela fonctionne avec des programmes écrits en COBOL, RPG et RPG ILE, avec des scripts CL et probablement dans d’autres langages.

La javadoc de la classe ProgramCall contient un bon exemple d’utilisation.

Une fois le service interfacé en Java, il est exposé vers le monde “ouvert” et peux donc être ré exposé sous toutes les formes possibles : WebService SOAP, Resource REST, EJB, …..

  • Consommer un service depuis l’AS/400

IBM met à disposition une boite à outil qui permet de consommer des WebServices SOAP depuis des programmes C, RPG ou COBOL qui tournent sur l’AS/400.Cette boite à outil est en fait un portage de la librairie Axis C vers l’AS/400 ce qui est à mon avis un bon signe de maturité.

Cet article explique la méthode à utiliser. Voici quelques remarques suite à l’utilisation que j’en ai faite.

  • Les chaines de caractères sont de type “xsd_string”, ils faut les passer au stub SOAP par adresse (%addr) et non par valeur.
  • Ne pas oublier de tronquer les chaînes de caractères à la bonne longueur et d’y ajouter un zéro binaire (X’00′) que ce soit pour l’URL du WebService ou pour ses paramètres

Le RedBook nommé “Building SOA-based Solutions for IBM System i Platform” documente les différentes manières d’intégrer un AS/400 dans une architecture orientée service.