Bonjour,
Je ne comprends pourquoi mon code réagit différemment sous GAE et en en local (malgré tout je sais qu'il existe des limites assez restrictives de GAE dans l'environnement d'exécution, mais quand même).
Voici mon interrogation:
Je suis dans ma servlet.
Ma première question: on parle bien d'un unique servlet par requête?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 public class MyServiceImpl extends RemoteServiceServlet implements MyService {
Mon interface graphique à 2 boutons. Chacun est relié à une fonction différente:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 public interface ArxchiService extends RemoteService { // retourne l'id de la session String getSessionID(String name) throws IllegalArgumentException; // retourne l'id de la session mais contient un wait(5*1000); String getSessionIDAvecWAIT() throws IllegalArgumentException; }Je prends 2 navigateurs (un sous IE, et un sous Firefox).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 @Override public String getSessionIDAvecWAIT() throws IllegalArgumentException { Object toto = new Object(); synchronized(toto){ try { System.out.println(" non -> attente (gèle de la connexion)."); toto.wait(1*5000); System.out.println("dégèle de la connexion (temps écoulé ou notifications)."); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } return "arxchi: " + getThreadLocalRequest().getRequestedSessionId(); }
Commun:
IE: Je clique sur le bouton 1 pour exécuter ma fonction getSessionID().
> Tout de suite, j'ai ma réponse (je reçois l'ID de session).
Mozilla: je fais la même opération. Résultat identique sauf que je récupère un id de session différent.
IE: Je clique sur la bouton 2 qui lance la fonction getSessionIDAvecWAIT().
5 secondes après je récupère un id de session.
Maintenant, voyons le test clé qui a un fonctionnement différent sous GAE et en local.
Cas 1: en mode debug (local).
IE: Je lance la deuxième fonction (avec le wait(5sec)).
Mozilla: et je lance juste après (1 sec maximum) la fonction 1.
Mozilla:Je reçois immédiatement sous Mozilla mon résultat (id de session).
IE: Je reçois sous IE l'id de session 5 secondes après.
Cas 2: GAE
IE: Je lance la deuxième fonction (avec le wait(5sec)).
Mozilla: et je lance juste après (1 sec maximum) la fonction un.
Mozilla Je ne reçois pas sous Mozilla mon résultat (id de session).
IE:Je reçois sous IE l'id de session 5 secondes après.
Mozilla: Et une fois le message sur IE arrivé, le message sous Mozilla apparaît.
Ma question: Pourquoi?
Le synchronized + le wait sur l'objet a verrouillé le thread courant. Je suis OK. Mais n'y-a-t-il pas de thread différent? 1 par requête? Le wait bloque tout le serveur on dirait...
edit: peut-être est-ce lié au cloud computing?
En attente d'avoir une réponse sur ce sujet. Merci !
RL
Partager