如何让Infinispan Spring Boot Starter与Hibernate二级缓存重用CacheManager?
我正在使用infinispan-spring-boot3-starter-embedded结合Spring Session实现分布式会话,功能运行正常。但应用同时使用Hibernate的SessionFactory(非JPA),为实现分布式二级缓存,配置了如下属性:
<property name="hibernate.cache.region.factory_class">infinispan</property>
该配置会将区域工厂设为org.infinispan.hibernate.cache.v60.InfinispanRegionFactory实现,但它会创建新的CacheManager而非重用Spring Boot Starter已经创建好的实例,导致默认传输机制冲突,日志频繁出现如下报错:
2023-10-30 13:58:09.311 ERROR 21424 [4,Rainbow-12965] o.j.l.Log4J2LogImpl : JGRP000191: failed receiving packet from /172.26.127.126:51131: java.io.EOFException
2023-10-30 13:58:09.467 ERROR 21424 [4,Rainbow-12965] o.j.l.Log4J2LogImpl : JGRP000191: failed receiving packet from /172.26.127.126:51131: java.lang.IllegalArgumentException: invalid magic number 258; needs to be in range [0..100]
Infinispan建议仅使用一个CacheManager,请问如何避免冲突并重用现有CacheManager?
要让Hibernate重用Spring Boot Starter创建的CacheManager,可以通过以下步骤实现:
替换区域工厂实现类
放弃默认的InfinispanRegionFactory,改用Spring集成的SpringInfinispanRegionFactory(包路径org.infinispan.hibernate.cache.v60.spring.SpringInfinispanRegionFactory)。这个工厂类会自动从Spring容器中获取已有的CacheManager实例,而非新建。修改Hibernate配置:<property name="hibernate.cache.region.factory_class">org.infinispan.hibernate.cache.v60.spring.SpringInfinispanRegionFactory</property>补充依赖包
确认项目中引入了infinispan-hibernate-cache-spring依赖,版本需与你的Infinispan、Spring Boot版本匹配。Maven项目添加依赖:<dependency> <groupId>org.infinispan</groupId> <artifactId>infinispan-hibernate-cache-spring</artifactId> <version>${infinispan.version}</version> </dependency>指定共享CacheManager的Bean名称
添加Hibernate配置属性,明确指向Spring容器中的CacheManager实例:<property name="hibernate.cache.infinispan.cache_manager">cacheManager</property>Spring Boot自动配置的
CacheManager默认Bean名称就是cacheManager,直接使用即可。验证效果
启动应用后检查日志,确认仅初始化了一个CacheManager实例,同时JGroups相关报错应消失。
内容的提问来源于stack exchange,提问作者waxwing

