从Wildfly 8迁移至Wildfly 26后Infinispan缓存失效问题排查
可能的原因及解决方案
1. 应用依赖版本冲突
这是迁移场景中最常见的问题:你的应用可能打包了Wildfly 8时代的旧版本Infinispan类库(如Infinispan 6.x/7.x),而Wildfly 26内置的是Infinispan 12.x版本。新旧版本的CacheContainer接口及内部实现不兼容,导致应用加载的旧版类无法识别服务器端已配置的缓存。
验证方式:解压应用的WAR/EAR包,检查WEB-INF/lib或lib目录下是否存在infinispan-*.jar、wildfly-clustering-infinispan-*.jar等相关依赖。
解决方法:移除这些第三方Infinispan依赖,改为使用Wildfly服务器提供的Infinispan模块。在Maven/Gradle中,将相关依赖的范围设置为provided,避免打包到应用中。
2. 缓存启动模式延迟
Wildfly 26中,Infinispan缓存默认采用LAZY启动模式,即缓存只会在第一次被实际访问时才初始化。而你的应用在@PostConstruct阶段就尝试获取缓存,此时缓存尚未完成初始化,系统会误认为缓存配置不存在。
验证方式:在调用cc.getCache()前添加短暂延迟(如Thread.sleep(5000)),若延迟后能正常获取缓存,说明是启动时机问题。
解决方法:在Wildfly缓存配置中显式设置缓存为EAGER启动:
<replicated-cache name="cachedb" start="EAGER"> <transaction mode="BATCH"/> </replicated-cache>
该配置会让缓存在服务器启动时完成初始化,确保应用初始化阶段能正常访问。
3. 配置文件命名空间不兼容
虽然Wildfly管理UI能识别旧命名空间的配置,但实际缓存配置可能未被正确注册到CacheContainer中。Wildfly 8使用的Infinispan配置命名空间(如urn:jboss:domain:infinispan:8.0)与Wildfly 26的命名空间(如urn:jboss:domain:infinispan:14.0)存在差异。
验证方式:检查Wildfly配置文件(如standalone.xml)顶部的命名空间声明,确认是否为Wildfly 26对应的版本。
解决方法:更新配置文件的命名空间为Wildfly 26匹配的版本,示例:
<server xmlns="urn:jboss:domain:18.0"> <!-- 其他配置 --> <subsystem xmlns="urn:jboss:domain:infinispan:14.0"> <cache-container name="reporting-cache" default-cache="cachedb"> <transport lock-timeout="60001"/> <replicated-cache name="cachedb" start="EAGER"> <transaction mode="BATCH"/> </replicated-cache> </cache-container> </subsystem> </server>
4. 服务器级缓存访问权限限制
Wildfly 26对服务器级缓存容器的访问权限做了更严格的控制,默认情况下,应用可能无法直接访问未配置权限的缓存。
解决方法:在缓存容器配置中添加安全授权配置,确保应用有权限访问缓存:
<cache-container name="reporting-cache" default-cache="cachedb"> <transport lock-timeout="60001"/> <security authorization="true"/> <replicated-cache name="cachedb" start="EAGER"> <transaction mode="BATCH"/> </replicated-cache> </cache-container>
同时可检查应用的jboss-deployment-structure.xml,确认是否正确引入了Infinispan模块。
内容的提问来源于stack exchange,提问作者OLA

