studio programacion móviles libros desarrollo desarrollar curso con aprende aplicaciones java design-patterns servlets hashmap mmo

java - móviles - manual de programacion android pdf



Implementación de la sesión Java (3)

Estoy desarrollando un juego en línea para varios jugadores. Tengo el siguiente problema:

Cuando el usuario rompe su conexión con el servidor, necesita volver a conectarse. En la primera conexión, durante el registro, el módulo de registro produce un ResponseDispatcher especial que contiene la referencia al canal de conexión. Pero si el usuario cierra la sesión, este canal deja de ser válido. Aunque puedo detectar el problema y limpiar los recursos, debo guardar la referencia al módulo de registro y al módulo de conexión en el módulo del juego, para renovar el canal cuando el usuario autoriza y vuelve a conectarse. Esto crea muchas interdependencias entre los módulos y se vuelve realmente difícil de mantener.

Lo que necesito es algo así como una HttpSession en Servlet Container, de modo que pueda obtener las referencias a mi canal y recursos de sesión de todos los módulos de mi servidor.

¿Cómo se implementa HttpSession en Servlet? ¿Es un hashmap global que almacena todo JSESSIONID, desde el cual el contenedor determina qué mapa de atributo devolver? Si se trata de una tabla sysmbol global, ¿alcanzará el rendimiento (aunque el tiempo es O (1) para hashMap, puede haber modificaciones de sesión, por lo que probablemente tenga que estar sincronizado)?

PD. Quizás algunas recomendaciones de patrones de diseño para este caso también lo hagan.



No estoy exactamente seguro de cuál es la pregunta. ¿Por qué "tiene que almacenar la referencia al módulo de registro y al módulo de conexión"?

De todos modos, hay dos soluciones sensatas para su problema.

1) Haga que el módulo de registro y el módulo de conexión sean Singletons. Si esto es útil depende completamente de la funcionalidad que proporcionan estos módulos.

2) Realice las entidades persistentes del módulo de registro y del módulo de conexión, guárdelas en una tienda de datos, complete con las referencias necesarias, y recupérelas y vuelva a generarlas al volver a conectarlas.

No estoy seguro de por qué implementar tu propia sesión sería algo que quieres hacer, ¿qué ocurre cuando la sesión se agota?

Tu diseño parece algo defectuoso. El jugador no debería "seguir conectado" si su conexión se interrumpe (esto es una contradicción en los términos, no puede por definición estar en línea si no está conectado a una red), independientemente de si fue intencional o no (no puede saber ya sea intencional o no), no tienes idea de si el jugador puede volver a conectarse oportunamente o no, por lo que debes asumir lo peor. Más importante aún, desde un aspecto puramente de diseño, ser asesinado por el juego, porque tu conexión a Internet es basura, probablemente no sea algo con lo que quieras lidiar. Si los datos persistentes son un asunto tan costoso, debería volver a examinar las opciones de su almacén de datos. Además, ¿qué sucede en el escenario donde el servidor se bloquea mientras está fuera de línea?


Yo recomendaría probar Shiro

Shiro puede manejar la administración de sesiones fuera de un contenedor de servlets.

Es posible que desee respaldar Shiro con EhCache para proporcionar el almacenamiento en caché adecuado y, si es necesario, la persistencia de la sesión (y balanceo de carga, etc.)