2010-08-23 3 views
1

J'ai une application Web GWT + GAE avec plusieurs services et modules. J'utilise le module functionlity de mvp4g. Tous mes services Étend:Les variables statiques finales sont réinitialisées dans Google App Engine Cloud

public abstract class BaseServiceImpl extends RemoteServiceServlet { 
protected final static Map USERS = new HashMap(); 

J'utilise UTILISATEURS pour stocker mes sessions en cours d'utilisateurs actifs. Une fois que l'utilisateur s'authentifie, je stocke son identifiant de session en tant que clé de la carte.

protected String getSessionId() { 
    return getThreadLocalRequest().getSession().getId(); 
} 

public String authenticate(String username, String password) { 
    ... 
    .. 
    . 
    String id = getSessionId(); 
    synchronized(this) {  
     users.put(id, user); 
    } 
    ... 
    .. 
    . 

Pour chaque requête, je vérifie si la session utilisateur est toujours valide.

J'ai activé les sessions. Ensuite, je posterai les dernières lignes de appengine-web.xml

... 
.. 
. 
<sessions-enabled>true</sessions-enabled> 
</appengine-web-app> 

Tout fonctionne très bien dans le serveur de développement. Toutefois, lorsque je le déploie sur le cloud du moteur d'applications google, la variable users est réinitialisée pour chaque requête.

Quelqu'un peut-il m'expliquer ce qu'il se passe? Comment dois-je procéder? Dois-je stocker les sessions utilisateur dans le magasin de données?

+0

Pour utiliser vos sessions correctement, placez simplement des données dans celles-ci. Par exemple. "session.setAttribute (" une clé ", myData) Vous pouvez la récupérer en utilisant getAttribute (" une clé ") Vos données doivent être sérialisables Vous n'êtes pas censé créer des cartes personnalisées basées sur sessionID en mémoire. –

Répondre

6

En GAE, chaque requête peut atteindre un serveur différent. En outre, votre application peut être annulée et redéployée à nouveau avant chaque requête. Vous ne devriez pas compter sur des variables statiques. Sauvegardez votre état dans les sessions ou dans la base de données.

est ici citation de http://code.google.com/appengine/docs/java/runtime.html

App Engine utilise plusieurs serveurs Web pour exécuter votre application, et ajuste automatiquement le nombre de serveurs qu'il utilise pour traiter les demandes de manière fiable. Une requête donnée peut être routée vers n'importe quel serveur, et ce n'est peut-être pas le même serveur qui a traité une requête précédente du même utilisateur.

Une fois que vous enable sessions, ils sont automatiquement stockés dans le magasin de données à la fin des demandes.

2

Google App Engine peut exécuter chaque requête sur un serveur différent. Ils ne garantissent pas que la même instance de la machine virtuelle traite la demande sur la même machine. Vous devrez stocker vos informations utilisateur dans un magasin persistant, tel qu'une table BigTable.