2016-06-04 17 views
1

Ich verwende Infinispan-Caching als Sitzungsbereichs-Bean zum Zwischenspeichern benutzerbezogener Datenobjekte in einer Spring MVC-Anwendung.Spring-Sitzung + Redis + Infinispan-Caching im Sitzungsbereich fehlgeschlagen

Jetzt wandern wir Boot zu springen, und wir wollen @enableRedisHttpSession verwenden aber wir stehen vor dem Problem, dass die Infinispan Cachemanager an die Sitzung gebunden nicht Serializable ist, die folgende Ausnahme produzieren:

java.lang.IllegalArgumentException: DefaultSerializer requires a Serializable payload but received an object of type [org.infinispan.spring.provider.SpringEmbeddedCacheManagerFactoryBean] 
    org.springframework.core.serializer.DefaultSerializer.serialize(DefaultSerializer.java:43) 
    org.springframework.core.serializer.support.SerializingConverter.convert(SerializingConverter.java:63) 
    org.springframework.core.serializer.support.SerializingConverter.convert(SerializingConverter.java:35) 
    org.springframework.data.redis.serializer.JdkSerializationRedisSerializer.serialize(JdkSerializationRedisSerializer.java:50) 
    org.springframework.data.redis.core.AbstractOperations.rawHashValue(AbstractOperations.java:166) 
    org.springframework.data.redis.core.DefaultHashOperations.putAll(DefaultHashOperations.java:128) 
    org.springframework.data.redis.core.DefaultBoundHashOperations.putAll(DefaultBoundHashOperations.java:85) 
    org.springframework.session.data.redis.RedisOperationsSessionRepository$RedisSession.saveDelta(RedisOperationsSessionRepository.java:409) 
    org.springframework.session.data.redis.RedisOperationsSessionRepository$RedisSession.access$000(RedisOperationsSessionRepository.java:331) 
    org.springframework.session.data.redis.RedisOperationsSessionRepository.save(RedisOperationsSessionRepository.java:211) 
    org.springframework.session.data.redis.RedisOperationsSessionRepository.save(RedisOperationsSessionRepository.java:141) 
    org.springframework.session.web.http.SessionRepositoryFilter$SessionRepositoryRequestWrapper.commitSession(SessionRepositoryFilter.java:193) 
    org.springframework.session.web.http.SessionRepositoryFilter$SessionRepositoryRequestWrapper.access$100(SessionRepositoryFilter.java:169) 
    org.springframework.session.web.http.SessionRepositoryFilter.doFilterInternal(SessionRepositoryFilter.java:127) 
    org.springframework.session.web.http.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:65) 
    org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:121) 
    org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
    org.springframework.boot.actuate.autoconfigure.MetricsFilter.doFilterInternal(MetricsFilter.java:103) 
    org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 

Typischerweise werden wir Sollen Benutzeranforderungen an mehrere Knoten verteilt werden, müssen wir den Cache zwischen den Knoten teilen (mit Redis-Speicher).

kann jemand helfen.

Antwort

2

Offensichtlich ist der Cache-Manager nicht serialisierbar, da er nicht serialisiert werden sollte - es sind keine Daten. Sie müssen das Feld verfolgen, das auf die SpringEmbeddedCacheManagerFactoryBean verweist, und diesen Übergang durchführen.

2

Sie sollten niemals einen Infinispan CacheManager (oder einen Cache) in der Sitzung speichern. Mach es zu einem Singleton.

Infinispan kann die Replikation ohne Redis durchführen, stellen Sie nur sicher, dass Sie den richtigen Cache-Modus aktivieren (zum Beispiel "repliziert" oder "verteilt") und Ihre Benutzerdaten von allen anderen Knoten verfügbar sind Speichere den Cache in Redis.