2010-09-06 23 views
6

¿Cómo puedo almacenar un objeto de instancia para cada sesión de usuario?sesión de objeto en playframework

Tengo una clase para modelar un algoritmo complejo. Este algoritmo está diseñado para ejecutarse paso a paso. Necesito crear instancias de objetos de esta clase para cada usuario. Cada usuario debería poder avanzar paso a paso su instancia.

+0

Su pregunta no es muy clara. Ayudaría si mencionas lo que estás tratando de hacer. –

+0

Soory, mi inglés es muy pobre. Edito ahora ... – barroco

Respuesta

6

Sólo puede almacenar los objetos en la memoria caché. Los objetos deben ser serializables para esto. En la sesión, puede almacenar una clave (que debe ser una Cadena) en la Caché. Asegúrese de que su código aún funcione si el objeto fue eliminado de la memoria caché (igual que un tiempo de espera de sesión). Se explica en http://www.playframework.org/documentation/1.0.3/cache. Espero que resolver su problema.

+0

¿Podría ponerme un ejemplo de uso ?, muchas gracias – barroco

+1

Lo siento, no puedo ver lo que podría mostrar en un ejemplo que no está documentado en la referencia documentación. – niels

4

para almacenar valores en la sesión:

//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 desea desactivar/borrar el objeto de sesión

session.clear() 
+2

Pero 'object' debe ser un' String', ¿verdad? – barroco

+1

Oh sí, el Objeto debe ser una Cadena – plunchete

+2

Entonces no es mi solución – barroco

0

del juego documentación: 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. 

Usted puede poner cualquier objeto en la memoria caché, como en el siguiente ejemplo (en este ejemplo a partir del documento http://www.playframework.org/documentation/1.1.1/controllers#session, utiliza session.getId() para guardar los mensajes de cada usuario)

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

Debido a que es una memoria caché, y no una sesión, hay que tener en cuenta que los datos ya no podrían estar disponibles, y pasar un buen significa para recuperarlo una vez más de somehere (el modelo de mensajes , en este caso)

De todos modos, si tiene suficiente memoria y requiere una breve interacción con el usuario, los datos deberían estar allí, y en caso de que no lo esté puede redirigir al usuario al comienzo del asistente (está hablando de algún tipo de página del asistente, ¿no?)

Ten en cuenta que el juego, con su enfoque de compartir sin estado, no tiene sessión en absoluto, por debajo solo lo maneja a través de cookies, por eso solo puede aceptar cadenas de tamaño limitado

+0

Ok, gracias. Pero descomente 'memcached = enabled' y' memcached.host = 127.0.0.1: 11211' en mi archivo application.conf y no funciona. Aparece este error: "Error: Error del servidor El servidor encontró un error y no pudo completar su solicitud. Si el problema persiste, informe su problema y mencione este mensaje de error y la consulta que lo causó". – barroco

+0

Te aconsejo que preguntes en los grupos de google de play, ellos son muy receptivos ... http://groups.google.com/group/play-framework – opensas

+0

No tengo experiencia con memcaches, pero se supone que está escuchando en localhost: 11211, es un servicio, debe instalarse y ejecutarse ... – opensas