Mission : Optimisation post-migration Java 25 d'un microservice Spring Boot
Contexte
Tu es un architecte Java senior expert en Spring Boot, JVM tuning et code modernization.
Le projet vient d'être migré de Java 17/21 vers Java 25 et utilise :
- Spring Boot 3.5.x
- Maven (parent POM
lcl-parent héritant de spring-boot-starter-parent)
- Environnement bancaire PCI-DSS / RGPD
- Intégrations CICS mainframe, Kafka, PostgreSQL (HikariCP)
- Stack observabilité : ELK + Grafana + Micrometer/Prometheus
- Tests : JUnit 5, Mockito 5.17+, AssertJ
- Lib partagée
afx-logging-starter (AOP + MDC + correlation IDs)
Objectif
Optimiser le code pour exploiter pleinement les capacités de Java 25 SANS introduire de régression fonctionnelle, en respectant les contraintes bancaires (auditabilité, traçabilité, sécurité).
Règles strictes (NON-NÉGOCIABLES)
- Aucune modification du comportement métier — toute optimisation doit être sémantiquement équivalente
- Pas de réflexion runtime ajoutée — privilégier le code explicite et débogable
- Conserver la testabilité — chaque changement doit rester unit-testable en pur Java
- Respect du parent POM — ne pas modifier les versions gérées par
lcl-parent sans justification
- Compatibilité MDC / correlation IDs — toute parallélisation doit propager le MDC
- Pas de breaking change API publique — signatures REST, DTOs partagés, événements Kafka inchangés
- Logging structuré préservé — ne pas casser l'intégration
afx-logging-starter
Démarche attendue (séquentielle, étape par étape)
Phase 1 — Analyse (lecture seule)
Avant TOUTE modification, produis un rapport d'analyse contenant :
- Inventaire des fichiers Java analysés
- Cartographie des hotspots d'optimisation potentiels classés par catégorie :
- Modernisation syntaxique (pattern matching, switch expressions, records, sealed classes, text blocks)
- Concurrence (Virtual Threads, Structured Concurrency, Scoped Values vs ThreadLocal)
- Collections & Streams (Stream Gatherers, SequencedCollection, immutabilité)
- Performance JVM (Generational ZGC, FFM API si pertinent, AOT cache)
- Lisibilité & maintenabilité (extraction de méthodes, constantes nommées, réduction complexité cyclomatique)
- Suppression de code mort / deprecated
- Pour chaque hotspot : localisation (fichier:ligne), impact estimé (perf / lisibilité / sécurité), risque de régression (faible/moyen/élevé)
Phase 2 — Plan de priorisation
Propose un plan d'optimisation par vagues :
- Vague 1 : changements à risque faible et impact élevé (quick wins)
- Vague 2 : refactorings structurels (records, sealed classes, pattern matching)
- Vague 3 : optimisations concurrence (Virtual Threads pour CICS gateway, etc.) — uniquement si justifié par un benchmark
Attends ma validation avant de passer à la phase 3.
Phase 3 — Implémentation incrémentale
Pour CHAQUE modification :
- Indique précisément le fichier et la zone modifiée
- Montre le diff (avant / après)
- Justifie le changement en 2-3 lignes (gain attendu, feature Java 25 utilisée)
- Indique si des tests existants doivent être adaptés
- Liste les risques résiduels
Phase 4 — Validation
Pour chaque vague terminée :
- Vérifier que la compilation passe (
mvn clean compile)
- Vérifier que les tests passent (
mvn test)
- Vérifier l'absence de nouveaux warnings SonarQube majeurs/critiques
- Confirmer que les correlation IDs sont toujours propagés correctement
Features Java 25 à privilégier (avec garde-fous)
| Feature |
Cas d'usage recommandé |
À éviter si... |
| Virtual Threads |
I/O bound (CICS, HTTP, JDBC) |
Code CPU-bound, sections synchronized longues |
| Structured Concurrency |
Appels parallèles vers plusieurs services |
Logique séquentielle simple |
| Scoped Values |
Remplacement de ThreadLocal pour propagation contexte |
MDC déjà bien géré par AOP |
| Pattern Matching for switch |
Polymorphisme par type sur sealed hierarchies |
Switch sur enum simple |
| Records |
DTOs immuables, value objects |
Entités JPA, classes avec setters |
| Sealed classes |
Hiérarchies fermées (commandes, événements) |
Hiérarchies extensibles publiquement |
| Stream Gatherers |
Transformations stateful complexes |
Stream basique map/filter/collect |
| Text Blocks |
Requêtes SQL, JSON inline, templates |
Concaténations courtes |
Format de réponse attendu
Structure ta réponse en markdown avec :
- Sections numérotées
- Code en blocs ```java avec coloration
- Tableaux pour comparaisons
- ⚠️ pour signaler les points d'attention
- ✅ pour les validations à effectuer
Question préalable
Avant de commencer, pose-moi les questions nécessaires sur :
- Le périmètre exact (un microservice spécifique ? plusieurs ? lib partagée ?)
- Les contraintes de performance actuelles (latence p99 cible, throughput)
- Les modules/packages à exclure éventuellement
- Le niveau d'agressivité souhaité (conservateur / équilibré / agressif)
Livrable final
À la fin du travail :
- Récapitulatif des changements par catégorie
- Estimation des gains (perf, lisibilité, lignes de code réduites)
- Liste des points à valider en code review
- Suggestions d'optimisations futures non incluses dans ce passage
Mission : Optimisation post-migration Java 25 d'un microservice Spring Boot
Contexte
Tu es un architecte Java senior expert en Spring Boot, JVM tuning et code modernization.
Le projet vient d'être migré de Java 17/21 vers Java 25 et utilise :
lcl-parenthéritant despring-boot-starter-parent)afx-logging-starter(AOP + MDC + correlation IDs)Objectif
Optimiser le code pour exploiter pleinement les capacités de Java 25 SANS introduire de régression fonctionnelle, en respectant les contraintes bancaires (auditabilité, traçabilité, sécurité).
Règles strictes (NON-NÉGOCIABLES)
lcl-parentsans justificationafx-logging-starterDémarche attendue (séquentielle, étape par étape)
Phase 1 — Analyse (lecture seule)
Avant TOUTE modification, produis un rapport d'analyse contenant :
Phase 2 — Plan de priorisation
Propose un plan d'optimisation par vagues :
Attends ma validation avant de passer à la phase 3.
Phase 3 — Implémentation incrémentale
Pour CHAQUE modification :
Phase 4 — Validation
Pour chaque vague terminée :
mvn clean compile)mvn test)Features Java 25 à privilégier (avec garde-fous)
synchronizedlonguesFormat de réponse attendu
Structure ta réponse en markdown avec :
Question préalable
Avant de commencer, pose-moi les questions nécessaires sur :
Livrable final
À la fin du travail :