IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

GWT et Vaadin Java Discussion :

Exécution différente entre debug mode et GAE?


Sujet :

GWT et Vaadin Java

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 106
    Points : 78
    Points
    78
    Par défaut Exécution différente entre debug mode et GAE?
    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.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    public class MyServiceImpl extends RemoteServiceServlet implements
    		MyService {
    Ma première question: on parle bien d'un unique servlet par requête?

    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;
    }
    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();
    	}
    Je prends 2 navigateurs (un sous IE, et un sous Firefox).
    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

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2010
    Messages : 61
    Points : 88
    Points
    88
    Par défaut
    C'est lié à GAE

    http://code.google.com/intl/fr/appen...a/runtime.html

    Tu ne peux en aucun cas être sur que deux requêtes qui se suivent aboutiront sur le meme server. De plus, toute l'api des Threads est indisponible sur GAE.

    Nb :C'est un peu de plus en plus confus entre gwt et gae, ne serait-il pas bon de créer un forum dédié a gae ?

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 106
    Points : 78
    Points
    78
    Par défaut
    Bonjour Raphaël,

    Merci de ta réponse ! Celà confirme mes intuitions.

    Effectivement, je savais qu'il y avait des contraintes liées à GAE (concernant la programmation concurrentielle (Thread) et au principe de multi-serveur web).

    Mais tu n'as pas assouvi une des questions que je me pose. (rassure moi) lorsque tu fais 10 requêtes distincts vers ton application (qui tourne sous GAE). Il y a bien 10 threads d'exécutions (1 par requête) coté GAE? où est-ce limité à 1 thread courant par appli? ou 1 thread par utilsateur?

    EDIT: j'ai réalisé un test. Dans une fonction d'un de mes services j'ai volontairement ajouté un traitement couteux, style:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    		int lol = 9;
    		ArrayList toto = new ArrayList(0);
    		for (int i=0;i<4000000;i++){
    			lol += i *((100*9)-(400+500));
    			System.out.println(lol);
    			toto.add(lol);
    		}
    Je lance la fonction plusieurs fois pour estimer son temps d'exécution moyen => 9 sec.
    Ensuite j'ouvre 2 navigateurs (IE+MOZILLA).
    Quasiment en même temps (1 sec d'intervalle) je lance la fonction sur IE puis sur Mozilla.
    J'ai mon résultat 9 secondes plus tard sur IE, et encore 9 secondes après sur Mozilla.
    Donc le client Mozilla a attendu 18 secondes...!!!!

    Est-ce normal?

    En faits, j'ai du mal à comprendre comment fonctionne GAE sur ce point. C'est pour ça que j'approuve ton idée concernant la création d'un espace dédié à GAE. Il aurait sa place avec toutes les spécificités qu'ils regorgent.

    Merci pour ta réponse encore et je serais heureux d'en savoir plus sur ce sujet.

    RL

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2010
    Messages : 61
    Points : 88
    Points
    88
    Par défaut
    Pour ce que j'en ai compris (donc des suppositions),
    Il y a un thread par servlet et une servlet par application.
    Ce que tu ne maitrises pas c'est le nombre (d'instance) d'applications, ni sur quel serveur ton application est chargée.

    C'est à dire qu'à chaque requête, GAE peut potentiellement charger une nouvelle instance ton application sur un nouveau serveur et router ta requête vers celle-ci.

    Grosse supposition :
    Dans ton cas où tu testes avec deux navigateurs :
    IE fait une première requête qui fait charger ton app sur un serveur.
    La requête prend énormément de temps (gros calcul), donc quand une seconde requête arrive, une nouvelle instance de l'app est chargée sur un autre serveur et la requête est redirigée vers celui-ci. Charger une nouvelle instance est très couteux en temps, donc ça peut expliquer la différence. (ou pas :s)

    Si quelqu'un pouvait confirmer svp ?

    Il y a peut-être la réponse dans les sessions du google I/O de l'an dernier mais je ne l'ai pas regardée, shame on me !

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 106
    Points : 78
    Points
    78
    Par défaut
    Salut Raphaël,

    Je suis assez sceptique quand même.

    J'ai fais la manipulation plusieurs fois, et à chaque fois, on a bien ce délai de 9 sec...et donc de 18 secondes pour la deuxième requête.

    Il y a un nombre limite d'instance max?

    La où je trouve bizarre GAE, c'est qu'il est présenté comme super "scalable" concernant la montée en charge. Pour moi là, je reste vraiment sceptique et quelque part, je me dis qu'il doit y avoir une explication...parce j'ai l'impression de tourner sur un mono-thread.

    Quelqu'un a une idée ?

    Merci.

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2010
    Messages : 61
    Points : 88
    Points
    88
    Par défaut
    Il faut entendre scalable en nombre de requêtes et surtout pas en durée des requêtes, c'est d'ailleurs pour ça qu'elles sont limitées à 30 secondes

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 106
    Points : 78
    Points
    78
    Par défaut
    Oui, c'est vrai.

    Mais je m'explique toujours pas pourquoi on observe un traitement type séquentiel requête après requête. Si la deuxième requête est chargée dans un autre servlet, il ne devrait pas y avoir autant d'attente (elle devrait prendre un poil plus que la 1er vu qu'il y a le chargement dans un autre serveur/servlet).

    J'arrive pas à trouver sur internet une explication concernant cette observation.

    Merci de m'avoir lu en tout cas. Si quelqu'un a des infos, je suis plus que preneur !

    Cordialement, RL

Discussions similaires

  1. Résultats différents en debug mode
    Par Titahn dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 20/10/2013, 19h43
  2. VS2008 Comportement différent entre debug et release
    Par Ardis dans le forum Visual Studio
    Réponses: 1
    Dernier message: 19/03/2011, 09h41
  3. Temps d'exécution différents entre Picasa et Gimp ?
    Par byloute dans le forum Imagerie
    Réponses: 0
    Dernier message: 06/05/2010, 15h12
  4. [RegEx] Résultat différent selon le mode d'exécution de PHP
    Par mgauffeny dans le forum Langage
    Réponses: 2
    Dernier message: 30/07/2008, 15h41
  5. Réponses: 8
    Dernier message: 11/03/2006, 18h40

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo