2010-09-06 5 views
6

Comment puis-je stocker un objet d'instance pour chaque session d'utilisateur? J'ai une classe pour modéliser un algorithme complexe. Cet algorithme est conçu pour fonctionner étape par étape. J'ai besoin d'instancier des objets de cette classe pour chaque utilisateur. Chaque utilisateur devrait pouvoir avancer étape par étape son instance.session d'objet dans playframework

+0

Votre question n'est pas vraiment claire. Cela aiderait si vous mentionnez ce que vous essayez de faire. –

+0

Soory, mon anglais est très pauvre. Je édite maintenant ... – barroco

Répondre

6

Vous ne pouvez stocker les objets dans le cache. Les objets doivent être sérialisables pour cela. Dans la session, vous pouvez stocker une clé (qui doit être une chaîne) dans le cache. Assurez-vous que votre code fonctionne toujours si l'objet a été supprimé du cache (identique à un délai d'attente de session). Il est expliqué au http://www.playframework.org/documentation/1.0.3/cache. Espérons que résoudre votre problème.

+0

Pourriez-vous me donner un exemple d'utilisation?, Merci beaucoup – barroco

+1

Désolé, je ne peux pas voir ce que je pourrais montrer dans un exemple qui n'est pas documenté dans le référencé Documentation. – niels

4

pour stocker des valeurs de la session:

//first get the user's session 
//if your class extends play.mvc.Controller you can access directly to the session object 
Session session = Scope.Session.current(); 
//to store values into the session 
session.put("name", object); 

Si vous souhaitez annuler/effacer l'objet de la session

session.clear() 
+2

Mais 'object' devrait être un' String', non? – barroco

+1

Oh oui, l'objet doit être une chaîne – plunchete

+2

Alors n'est pas ma solution – barroco

0

de la documentation de jeu: http://www.playframework.org/documentation/1.1.1/cache

Play has a cache library and will use Memcached when used in a distributed environment. 

If you don’t configure Memcached, Play will use a standalone cache that stores data in the JVM heap. Caching data in the JVM application breaks the “share nothing” assumption made by Play: you can’t run your application on several servers, and expect the application to behave consistently. Each application instance will have a different copy of the data. 

Vous pouvez mettre un objet dans le cache, comme dans l'exemple suivant (dans cet exemple de la doc http://www.playframework.org/documentation/1.1.1/controllers#session, vous utilisez session.getId() pour enregistrer les messages pour chaque utilisateur)

public static void index() { 
    List messages = Cache.get(session.getId() + "-messages", List.class); 
    if(messages == null) { 
     // Cache miss 
     messages = Message.findByUser(session.get("user")); 
     Cache.set(session.getId() + "-messages", messages, "30mn"); 
    } 
    render(messages); 
} 

Parce qu'il est un cache, et non une session, vous devez prendre en compte que les données ne peuvent plus être disponibles, et avoir une certaine signifie pour le récupérer une fois de plus somehere (le modèle de message , dans ce cas)De toute façon, si vous avez assez de mémoire et que cela implique une courte interaction avec l'utilisateur, les données devraient être là, et dans le cas contraire, vous pouvez rediriger l'utilisateur au début de l'assistant (vous parlez d'une sorte de page de l'assistant, à droite?)

Ayez à l'esprit que le jeu, avec son approche apatride-rien du tout, n'a vraiment aucune sessión du tout, il se contente de le gérer à travers les cookies, c'est pourquoi il n'accepte que des cordes de taille limitée

+0

Ok, merci. Mais je décommenter 'memcached = enabled' et' memcached.host = 127.0.0.1: 11211' dans mon fichier application.conf et ne fonctionne pas. J'obtiens cette erreur: "Erreur: Erreur de serveur Le serveur a rencontré une erreur et n'a pas pu compléter votre demande Si le problème persiste, signalez votre problème et mentionnez ce message d'erreur et la requête qui l'a causé." – barroco

+0

Je vous conseille de demander à google groupes de jeu, ils sont très réactifs ... http://groups.google.com/group/play-framework – opensas

+0

Je n'ai aucune expérience avec memcaches, mais il est supposé être à l'écoute de localhost: 11211, c'est un service, il devrait être installé et en cours d'exécution ... – opensas