当前位置: 首页 > 知识库问答 >
问题:

会话作用域中的Spring会话Redis Infinispan缓存失败

慎懿轩
2023-03-14

我使用Infinispan缓存作为会话作用域bean,在Spring MVC应用程序中缓存与用户相关的数据对象。

现在我们迁移到Spring引导,我们想使用@enableRedisHttp会话,但我们面临的问题是,附加到会话的InfinispanCacheManager是不可序列化的,产生以下异常:

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)

通常,我们会平衡用户对多个节点的请求,因此需要在节点之间共享缓存(使用Redis store)。

有谁能帮忙吗。

共有2个答案

姜彬郁
2023-03-14

永远不要在会话中存储InfinispanCacheManager(或缓存)。让它成为一个单例。

Infinispan能够在不需要Redis的情况下处理复制,只需确保启用正确的缓存模式(例如“已复制”或“分布式”),您的用户数据就可以从所有其他节点获得,而无需将缓存存储在Redis中。

邹海超
2023-03-14

显然,缓存管理器是不可序列化的,因为它不应该被序列化——它不是数据。您必须跟踪引用SpringEmbeddedCacheManagerFactoryBean的字段,并使其暂时化。

 类似资料:
  • 在我正在开发的应用程序中,我使用了Spring JMS DefaultMessageListenerContainer和作为SessionAwareMessageListener的JMS使用者。还有一个XA transactionManager,在JMS和JDBC之间共享。作为JMS提供者,我使用WebLogic。 我注意到,每次消费者收到一条消息时,JMS会话都与之前消息中使用的会话完全不同:

  • 问题内容: 我将JSF 2用于视图,将Spring用于业务逻辑。我正在尝试使用注解(@Scope(“ session”))将会话范围设置为我的一个Spring bean,但是却遇到了这个异常: 我知道RequestContextListener。在我的web.xml中。我还添加了RequestContextFilter: 似乎没有任何作用。我究竟做错了什么?谢谢! 问题答案: 尝试使用aop:sc

  • 我有一个springbean和scope会话。这个bean持有对另一个不可序列化的单例bean的引用。如果我想序列化会话范围的bean,最好的方法是什么? 这里已经提出了同样的问题:Spring会话范围的bean(控制器)和对服务的引用,在序列化方面 公认的答案是: 这个问题在Spring 3.0中通过提供一个非序列化bean的代理来解决,该代理从当前应用程序上下文中获取实例 据我所知,链接视频中

  • 目前正在用Spring Boot 2.0.0.M4、Spring 5.0.0.RC4和Reactor 3.1.0.RC1进行反应性编程。 如果没有,这是计划好的吗? 谢谢你抽出时间。

  • 成功登录后,我想用新的url继续进行进一步的请求处理。但url正在调用springmvc中的公开服务,其中的安全配置不会检查会话身份验证以获取传入url。请看下面的代码。 当jsp页面提交登录验证时,J_security_check调用目标url,该URL随后调用拦截器模式/home*并验证登录凭证。 如果我在登录之前调用公开的服务“/address/userid/”,它将直接调用服务方法,使其成

  • 我的应用程序通过Infinispan Spring Boot Starter使用Infinispan的Spring会话实现。我通过使用嵌入式模式。Spring会话集成留档非常稀疏,它没有提到任何关于会话缓存的推荐缓存模式的内容。 我一直在使用DIST_SYNC模式,但我注意到日志中偶尔会出现错误。是否有更合适的缓存模式,或者这可能是错误? 我使用的是Spring Boot 2.2.10、Infin