Archives par étiquette : java

Gestion de session avec un cluster redis

Voyons comment mettre en pratique les deux articles précédents (ici et ici).

Les choses n’étant pas encore très évolués du cote de spring-data-redis pour le mode cluster, je suis revenu sur la version de session-webapp utilisant une valve tomcat.

Les seules modifications apportées sont la suppression de l’image redis (je vais utiliser la version cluster) et l’utilisation d’une nouvelle image docker de base pour les serveurs Tomcat.

En effet, j’ai modifié la valve pour utiliser la nouvelle classe JedisCluster à la place de Jedis.
Mais pour que cela fonctionne, j’ai du utilisé la version 3.0.0-SNAPSHOT de jedis. La version releasée actuelle n’implémente pas les commandes binary par la lecture/ecriture.

J’ai du également modifié l’image docker pour le cluster redis car par default, le cluster est configuré en 127.0.0.1. Mais quand le client java essaye de découvrir la topologie du cluster, il obtient ces ips, et ne peux pas se connecter aux autres noeuds. La modification permet d’établir la connexion sur l’ip du conteneur.

Il ne reste plus qu’à lancer tout ce petit monde:

redis:

tomcat & haproxy

 

Lorsque je crée une session, je la vois bien sur un noeud redis et sur un autre noeud, je vois bien le message de redirection:

 

 

 

Les sources sont ici:
tomcat-session-manager
webapp
docker-redis-cluster

 

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

 

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