Archives de catégorie : java

Mon disque est rempli de snapshots

En analysant l’espace disque d’un serveur, je me suis aperçu que sur notre nexus (repository manager) nous avions un historique assez impressionnant de snapshot. En effet, nous avions tous les builds depuis près de 4 ans à raison d’un build par jour. Cela occupait pas moins de 700Go.

Continuer la lecture

Mais pourquoi je loggue autant?

La semaine dernière, j’ai trouvé un problème intéressant. Lors de la mise à jour d’une application, celle-ci a commencé à logguer en mode DEBUG de façon aléatoire. Sur certains serveurs tout marchait correctement, mais sur d’autres, non. En apparence, tout semblait normal, le fichier log4j.properties n’avait pas changé.

En regardant les logs, un message à attiré mon attention:

Chose intéressante, sur les serveurs à problème le message était plutôt de ce type:

SLF4j va prendre la première implémentation qu’il trouve. Dans notre cas ce sera logback-classic sur certains serveurs (cela va dépendre du chargement des classes dans le classloader).

Là où le problème arrive c’est que nous ne sommes pas supposés utiliser logback mais plutôt log4j. Nous n’avons pas de fichier de configuration de logback.

En suivant la documentation, voici ce qui se passe:

Nous n’avons aucun de ces fichiers,  donc logback va écrire dans la console. Mais avec quel niveau de logs ? Et bien c’est écrit dans la doc :

C’était donc ca. Un manque de fichier de configuration et notre serveur passe en mode DEBUG.

Mais pourquoi avoir rajouter une telle librairie (logback-classic)?

Ce n’était pas volontaire, c’est une dépendance transitive qui est remontée en ajoutant une autre dépendance à un projet.

conclusion 1: toujours surveiller les dépendances remontées par les librairies

conclusion 2: toujours prêter attention aux messages dans les logs

PS: dans la version 1.6.6, slf4j va indiquer en plus dans les logs, la classe StaticLoggerBinder qu’il utilise. Cela permet de contrôler encore mieux ce qu’il se passe réellement sur le serveur.

Redis Cluster en java

En commençant à regarder le mode cluster de redis à travers une image docker déjà construire https://github.com/Grokzen/docker-redis-cluster, je me suis aperçu que ce n’est pas si transparent. En effaçant, si on essaye d’ajouter une valeur mais que la clé ne correspond au bon noeud, redis ne renvoi pas OK mais plutôt l’indication de ou insérer la donnée:

Je me suis demandé comment gérer cela dans un programme Java. Est-ce le driver qui va faire le travail ou il faut le gérer à la main.

Si on utilise le driver standard de Jedis, voici ce qu’on obtiens:

Heureusement, Jedis propose une classe pour résoudre ce problème (Je n’ai rien trouvé coté JRedis).

 

Le driver est même capable de récupérer les autres noeuds. Dans l’exemple j’ai indiqué un seul noeud, mais avec le code suivant :

on voit bien que le driver a pu récupérer les autres noeuds:

les sources sont ici

Quelques liens utiles:
commandes redis cluster

– À la découverte de Redis Cluster 3.0

 

Intellij consomme de la CPU

J’ai rencontré un problème récemment de consommation CPU élevée de la part d’Intellij sous Windows.

Après quelques recherches sur internet, il semble que cela soit un problème de mémoire pas assez important.

voici comment faire pour améliorer les choses:

Fermer Intellij

Dans le répertoire %USER_HOME%\.IntelliJIdea14\config\options éditer le fichier project.default.xml

et modifier la ligne

pour augmenter la taille max de la mémoire

Relancer Intellij. La consommation CPU devrait baissée drastiquement.

 

Partage de session avec spring-session

Un collègue m’a fait découvrir spring-session lors d’un échange sur la façon de stocker les sessions dans un tiers.

J’ai donc décidé de reprendre mon poc pour l’adapter à cette librairie.

La mise en place est assez simple. Il faut juste créer 2 classes.

1 pour la configuration (Config) et 1 pour que spring initialise mon application (Initializer). Dans une application existante la dernière classe n’est pas obligatoire. Il suffira de déclarer le bean config dans le fichier de context XML spring.

  • configuration:

Il suffit de placer l’annotation EnableRedisHttpSession et de déclarer un bean pour la connectionFactory. Par defaut JedisConnectionFactory se connecte sur la base redis en localhost. Dans mon cas, j’ai surchargé pour aller sur le host db (container redis)

Il faut supprimer aussi le fichier context.xml qui n’est plus nécessaire.
Il faut passer en servlet 3.0 pour que l’initialisation fonctionne.

et voilà, c’est tout.

On peut tester le tout avec les commandes:

 

  • Changements:

Par rapport au précédent article, le poc a subi quelques modifications pour fonctionner:

– passage à tomcat 8
– inclusion de spring 4
– inclusion de spring web
– inclusion de spring-data
– servlet 3.0

Les sources sont disponibles ici

Merci Raphaël pour l’info.

 

Erreur de commit SVN avec intellij

Si vous rencontrez l’erreur suivante lors d’un commit SVN :

Il s’agit apparemment de problème lié à localisation de SVN.

pour solutionner le problème, il faut ajouter au fichier idea.sh

Solution trouvée ici

Configurer Selenium par annotations

Pour faire suite à l’article précédent sur la configuration spring, voici le même type de configuration pour Selenium (outil de test d’intégration pilotant un navigateur).

On va pouvoir lancer les tests avec seulement 3 classes et 0 xml.

1 – on définit une classe de configuration qui va contenir l’url de base du site et le driver du navigateur à tester:

2 – on définit ensuite une classe abstraite qui va référencer la configuration et va contenir un petit « tips » pour ne pas avoir plusieurs processus de firefox en même temps, lorsque qu’on lance plusieurs tests

3- et enfin la classe de test qui vérifie que le code du controller est correcte:

4- pour que tout s’enchaîne correctement, il faut modifier le pom.xml

et ajouter les dépendances suivantes:

Attention: La version de selenium est fortement lié à la version de firefox. Si l’exemple ne marche pas, il faut vérifier qu’une nouvelle version n’est pas disponible.

Le lancement de la commande

devrait donner un résultat du type:

 

Les sources sont ici: github

références:

Configurer spring sans fichier XML

Pour changer un peu de docker, voici un petit article pour initier un projet spring sans fichier de configuration XML.

Je vais créer une petite application avec un Controller Spring MVC.

Tout d’abord, on ajoute les dépendances. Servlet 3.1, spring-context , spring mvc suffisent:

On va ensuite créer une classe qui va permettre de gérer l’initialisation de la configuration spring. Pour cela, j’utilise une nouveauté de servlet 3.0 qui est  l’interface WebApplicationInitializer:

En implémentant une classe avec la méthode onStartup, on peut faire l’initialisation de son application. C’est plus simple que de faire une « fausse » servlet avec un paramètre loadOnStartup dans le fichier web.xml

Voici le code de la classe que j’utilise:

La méthode getContext va permettre de gérer la configuration par annotation en commençant par le package com.axioconsulting.demo.spring.config.

Dans ce package, j’ai défini 2 classes.

L’annotation @Configuration permet à Spring de savoir que cette classe est à prendre en compte pour la configuration. Dans notre cas, on précise juste qu’il faut scanner le package com.axioconsulting.demo.spring.controller (c’est là que va se trouver le controller)

Cette classe permet d’importer la configuration spring MVC.

NB: On aurait pu fusionner les 2 classes.

Il ne reste plus qu’à mettre en place le controller.

Il s’agit d’un controller basic qui va répondre un message sur /hello ou sur /hello?name=monNom

anonyme monNom

Et voila, on a réussi à initier une appli spring MVC en manipulant seulement des annotations ce qui me parait plus simple.

A voir sur le long terme et sur un projet un peu plus gros si les annotations sont suffisantes.

Les sources sont ici:  https://github.com/BenoitCharret/demoSpring