2010-09-06 19 views
6

Jak mogę przechowywać obiekt obiektu Foreach na sesję użytkownika?Sesja obiektu w Playframework

Mam klasę do modelowania złożonego algorytmu. Ten algorytm jest zaprojektowany do uruchamiania krok po kroku. Potrzebuję wykonać instancję obiektów tej klasy dla każdego użytkownika. Każdy użytkownik powinien móc krok po kroku przesuwać swoją instancję.

+0

Twoje pytanie nie jest zbyt jasne. Pomogłoby Ci wspomnieć o tym, co próbujesz zrobić. –

+0

Soory, mój angielski jest bardzo biedny. Edytuję teraz ... – barroco

Odpowiedz

6

można przechowywać tylko obiekty w pamięci podręcznej. Obiekty muszą być możliwe do serializacji. W sesji możesz zapisać klucz (który musi być łańcuchem) do pamięci podręcznej. Upewnij się, że Twój kod nadal działa, jeśli obiekt został usunięty z pamięci podręcznej (tak samo jak limit czasu sesji). Zostało to wyjaśnione w http://www.playframework.org/documentation/1.0.3/cache. Mam nadzieję, że rozwiążesz problem.

+0

Czy możesz podać mi przykład użycia ?, wielkie dzięki – barroco

+1

Niestety nie widzę co mógłbym pokazać w przykładzie, który nie jest udokumentowany w odnośniku dokumentacja. – niels

4

do przechowywania wartości w sesji:

//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); 

Jeśli chcesz unieważnić/wyczyścić obiekt sesji

session.clear() 
+2

Ale 'object' powinien być' String', prawda? – barroco

+1

O tak, obiekt musi być ciągiem – plunchete

+2

To nie jest moje rozwiązanie – barroco

0

z dokumentacją Play: 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. 

można umieścić dowolny obiekt w pamięci podręcznej, jak w poniższym przykładzie (w tym przykładzie z doc http://www.playframework.org/documentation/1.1.1/controllers#session, należy użyć session.getId(), aby zapisać wiadomości dla każdy użytkownik)

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); 
} 

Bo to pamięć podręczna, a nie sesja, trzeba wziąć pod uwagę, że dane mogą nie być dostępne i mają pewne myśli, aby pobrać go ponownie z somehere (model wiadomość w tym przypadku)

W każdym razie, jeśli masz wystarczająco dużo pamięci i wymaga to krótkiej interakcji z użytkownikiem, dane powinny tam być, a jeśli nie, możesz przekierować użytkownika na początek kreatora (mówisz o jakimś rodzaju strona kreatora, prawda?)

Należy pamiętać, że gra, z jej bezpaństwowym udziałem - podejściem niczym, w rzeczywistości nie ma żadnego sessión, pod nim obsługuje tylko pliki cookie, dlatego może akceptować tylko ciągi o ograniczonym rozmiarze

+0

Ok !, dzięki. Ale odkomentuję 'memcached = enabled' i' memcached.host = 127.0.0.1: 11211' w moim pliku application.conf i nie działa. Pojawia się następujący błąd: "Błąd: Błąd serwera Serwer napotkał błąd i nie mógł zakończyć twojego żądania. Jeśli problem będzie się powtarzał, zgłoś problem i napisz ten komunikat o błędzie oraz zapytanie, które spowodowało błąd." – barroco

+0

Radzę ci zapytać w grupach google play, są bardzo responsywne ... http://groups.google.com/group/play-framework – opensas

+0

Nie mam żadnego doświadczenia z memcaches, ale jest on przeznaczony do słuchania na localhost: 11211, to usługa, powinna być zainstalowana i działa ... – opensas