Preámbulo
que está planeando utilizar como una aplicación Ehcache primer cheque de gestión de sesiones, si no se puede utilizar, por casualidad, una implementación sesión ya proporcionada, y probablemente más apropiado. Si está utilizando un contenedor web o un servidor completo Jee descarnada realmente debería probar esta primera
Por qué
bien. Está seguro de que no lo hará de la manera más fácil. Aquí hay algunos consejos, por qué es posible que desee utilizar ehCache para las sesiones
- Su servicio no forma parte de un servidor jee/contenedor web.
- Su servicio no tiene estado, pero de vez en cuando necesita estados (código de marco).
- No puede distinguir llamadas debido a un proxy entre usted y el cliente distinguible, por ejemplo, usted es un tipo de middleware para un servicio/servicio que no proporciona datos distinguibles por defecto, pero utiliza parámetros como userId o sessionId condicionalmente pero no constitutivamente .
- Usted simplemente no hizo RTFM y quiere hacerlo a su manera.
Para 1, compruebe si un contenedor web como el muelle es una opción. Ciertamente usas el acceso web de toda la sesión que no aparecería para ti.
Para 2 compruebe, si Apache Shiro no hará lo que quiera. Si no, ehCache podría ser tu amigo.
Para 3 ... Bienvenido al club.
Para 4 ... bueno, supongo que si no leyó el manual, tampoco lo leerá.
Cómo
Si desea implementar una gestión de sesiones utilizando Ehcache favor asegurar que sus datos es serializable. Esto reducirá los problemas y le permitirá usar las funciones confidenciales de ehCache. a saber, la persistencia en el disco, los nodos de almacenamiento en caché, la recuperación de esto, y así sucesivamente.
Do no utilizar una memoria caché para cada sesión, pero uno caché para todas las sesiones. El sessionId
es la clave en su caché, y los valores van a un Map
. No te olvides de la simultaneidad (piensa en llamadas ajax). Puede ser mejor usar el ConcurrentHashMap
desde java.util.concurrent
. Pero tal vez sea Dr Heinz M. Kabutz y encuentre una forma aún más genial de hacerlo.
Me pareció muy útil utilizar el tamaño en lugar de la cantidad de elementos para mantener en el almacenamiento. Es posible que no sepa qué datos/objetos se almacenan más adelante. No te olvides de establecer una estrategia de persistencia. Utilicé el almacenamiento de la carpeta temporal aquí.
<?xml version="1.0" encoding="UTF-8"?>
<ehcache
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="ehcache.xsd"
updateCheck="true"
monitoring="autodetect"
dynamicConfig="true">
<diskStore path="java.io.tmpdir"/>
<cache name="vocCache"
eternal="false"
maxElementsInMemory="100MB"
maxElementsOnDisk="1GB"
timeToIdleSeconds="3600"
timeToLiveSeconds="0"
memoryStoreEvictionPolicy="LRU"
diskExpiryThreadIntervalSeconds="60">
<persistence strategy="localTempSwap" />
</cache>
Porque queremos implementar un gestor de sesiones, no nos molestamos sobre timeToLiveSeconds
. Sesiones de tiempo de espera después de un cierto tiempo de inactividad. Por lo tanto, no restringimos el elemento a un ttl máximo, sino que usamos el timeToIdleSeconds
para dejar que un elemento expire. No se moleste con timeToIdleSeconds
y timeToLiveSeconds
porque puede establecer valores específicos a los elementos para agregarlos más adelante.
desalojo
Una nota en el tiempo de expiración. Un elemento en la memoria nunca será desalojado debido a un tiempo configurado. La memoria se acumulará hasta que se golpee la restricción de memoria definida. Por lo tanto, si define 100 elementos, si se agrega el elemento 101, se activará el memoryStoreEvictionPolicy
y se vaciará un elemento (en esta configuración) en el disco (ehCache 2.2). Para el almacenamiento en disco, habrá un hilo que compruebe el tiempo de caducidad (diskExpiryThreadIntervalSeconds
). Vea el documentation. Por lo tanto, debe verificar el elemento recuperado de la memoria caché usando isExpired()
para asegurarse de que no ha expirado.
Así que al final, el resultado final será con algo como esto:
GET
Cache cache = CacheManager.getInstance().getCache(CACHE_NAME);
Element elem = cache.get(identifier);
if (elem == null)
{
throw new SessionNotFoundException(identifier);
}
if (elem.isExpired())
{
throw new SessionExpiredException(identifier);
}
return elem.getObjectValue();
PUT
Cache cache = CacheManager.getInstance().getCache(CACHE_NAME);
// We use ttl = 0 and tti=<ttlInMinutes>, because session timeout is based on session idle timout.
element = new Element(identifier, new SessionElement(), Boolean.FALSE, (int) (timeToLive/VALUE_MS), 0);
cache.put(element);
Hola Ramki También estoy tratando para implementar ehcache puedes tener alguna buena guía o tutorial para el mismo si es así, por favor proporcione el enlace de la misma. –
Hola, ¿qué servidor de aplicaciones estás usando? –