Bonjour,

J'ai un écran qui contient diverses données.
-on coche les lignes souhaitées
-on crée un fichier Excel et on change enfin le statut des données puis on rafraîchit la page.

Risque : 2 sessions peuvent tenter de faire la même demande avant le changement de statut des données (sinon la question ne se poserait pas, il suffirait de commencer à vérifier le statut en base)

A] Une des solutions envisagées :
Remplacer
Code : Sélectionner tout - Visualiser dans une fenêtre à part
public ActionForward myAction
par
Code : Sélectionner tout - Visualiser dans une fenêtre à part
public synchronized ActionForward myAction
Question1 : là, j'ai pas tout compris donc je compte sur vous pour m'expliquer, mais on m'a dit que si je fais ça, non seulement j'empêche les autres sessions/utilisateurs de rentrer en même temps dans la fonction (ce qui résoud éventuellement mon potentiel problème d'accès concurrents même si c'est idiot de bloquer quand c'est des lignes différentes) mais je les empêche aussi d'exécuter n'importe quelle autre fonction de ma classe Action. On m'a parlé aussi de comportement différent entre Struts1 et Struts2.




B]La solution qui vient d'être mise en place :
Insérer en début de fonction un bloc synchronized
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
synchronized (syncCkecker) {
//Traitements expliqués ci-dessous
}
qui va lire la liste mise dans le context de la servlet
Code : Sélectionner tout - Visualiser dans une fenêtre à part
List<Integer> servList = (List<Integer>)request.getSession().getServletContext().getAttribute("myList");
On teste si la nouvelle liste demandée contient des éléments communs
a)OUI --> erreur affichée sur la page
b)NON -->on lui ajoute les éléments de la nouvelle liste demandée

Puis la fonction continue ses traitements entourée par un try...catch...finally où dans le finally on purge la liste enregistrée dans le contexte de la servlet des ordres qu'on a ajouté au début.
Question2 :Ca vous semble la meilleure solution?