Application Spring Boot de planification de voyages personnalisés, reprise et améliorée dans le cadre du Projet 8 du parcours Java d'OpenClassrooms (correction de bugs, optimisation des performances, mise en place d'un pipeline d'intégration continue).
TourGuide propose à ses utilisateurs des attractions touristiques à proximité, ainsi que des forfaits de voyage associés. Chaque action de l'utilisateur lui permet d'accumuler des points de fidélité auprès des partenaires.
Le projet original présentait trois problèmes que j'ai eu à traiter :
- des tests instables liés à des accès concurrents non protégés,
- un bug fonctionnel dans la recommandation d'attractions,
- des performances insuffisantes sur les opérations de masse (100 000 utilisateurs).
Ce dépôt contient la version corrigée.
- Java 17, Spring Boot 3.1.1, Maven
- Bibliothèques métier locales (non publiées sur Maven Central) :
gpsUtil,RewardCentral,TripPricer, fournies dansTourGuide/libs/ - Tests : JUnit 5
- CI : GitHub Actions
Côté composants :
TourGuideControllerexpose les endpoints REST.TourGuideServiceorchestre la logique principale et délègue les appels lents à un pool de threads dédié pour la récupération des localisations (gpsUtil).RewardsServicecalcule les points de fidélité et utilise son propre pool de threads pour les appels àRewardCentral.- Les collections internes de l'utilisateur (
visitedLocations,userRewards) sont desCopyOnWriteArrayListpour rester sûres en accès concurrent.
- JDK 17 ou supérieur
- Maven 3.9+
J'ai personnellement testé le build avec Eclipse Temurin 17 (utilisé par la CI) et Oracle JDK 23 (en local).
Toutes les commandes Maven se lancent depuis le dossier TourGuide/.
cd TourGuide
mvn clean packageLe JAR exécutable est généré dans TourGuide/target/tourguide-0.0.1-SNAPSHOT.jar.
java -jar TourGuide/target/tourguide-0.0.1-SNAPSHOT.jarL'application est ensuite accessible sur http://localhost:8080.
| Endpoint | Description |
|---|---|
GET /getLocation?userName=<user> |
Dernière localisation connue d'un utilisateur |
GET /getNearbyAttractions?userName=<user> |
5 attractions les plus proches, avec distance et points de récompense |
GET /getRewards?userName=<user> |
Récompenses accumulées par un utilisateur |
GET /getTripDeals?userName=<user> |
Forfaits voyages personnalisés |
Pour tester rapidement, des utilisateurs internes sont générés au démarrage : internalUser0, internalUser1, etc.
cd TourGuide
mvn testSuites présentes :
TestTourGuideService— services principaux (3 tests)TestRewardsService— calcul des récompenses, dontnearAllAttractions(2 tests)TestPerformance— tests de charge à 100 000 utilisateurs (2 tests)TourguideApplicationTests— vérification du contexte Spring (1 test)
Mesures obtenues sur ma machine de test (AMD Ryzen 9 7900X, 32 Go de RAM, JDK 23) :
| Test | Objectif OC | Mesure |
|---|---|---|
highVolumeTrackLocation (100 000 users) |
≤ 15 min | 3 min 23 s |
highVolumeGetRewards (100 000 users) |
≤ 20 min | 1 min 45 s |
La démarche complète (profiling VisualVM, choix de la parallélisation par CompletableFuture, tuning empirique des pools, sécurisation des collections concurrentes) est détaillée dans la documentation technique livrée avec le projet.
Workflow GitHub Actions (.github/workflows/build.yml) déclenché sur :
- push vers
devoumaster, - pull request vers
master, - déclenchement manuel via
workflow_dispatch.
Étapes : checkout → setup Java 17 → installation des JARs locaux dans le dépôt Maven du runner → mvn test → mvn package -DskipTests → upload du JAR comme artefact téléchargeable (rétention 30 jours).
Le projet Maven se trouve dans le sous-dossier TourGuide/ (sources, tests et pom.xml). Les trois JARs locaux non publiés sur Maven Central sont conservés dans TourGuide/libs/. La configuration du pipeline est dans .github/workflows/build.yml.
Antoine Filho — Parcours Développeur d'application Java, OpenClassrooms.