从Wildfly 10迁移至Wildfly 12后Infinispan缓存查找失败求助
解决Wildfly 12中Infinispan本地缓存查找失败的问题
从Wildfly 10迁移到12时碰到Infinispan缓存查找失效的问题?这大概率是因为Wildfly 12对Infinispan的JNDI命名规则和配置要求做了更新,我之前处理过类似的迁移坑,下面给你具体的排查和修复步骤:
1. 修正JNDI Lookup路径是关键
Wildfly 12里Infinispan的JNDI命名格式和10版本不一样了,你之前用的java:jboss/infinispan/container/DataCache是缓存容器的路径,但如果你的目标是获取modelcache这个具体缓存实例,得用新的路径格式:
java:jboss/infinispan/cache/DataCache/modelcache
所以你的@Resource注解要改成这样:
@Resource(lookup = "java:jboss/infinispan/cache/DataCache/modelcache") private Cache<String, Object> modelCache; // 记得根据你的实际数据类型调整泛型
要是你确实需要获取整个缓存容器,那原来的路径java:jboss/infinispan/container/DataCache在12里还是能用,但业务代码一般直接用具体缓存实例更合理。
2. 补全standalone-full.xml的缓存配置
你的基础配置没问题,但Wildfly 12对Infinispan的配置要求更明确,建议给本地缓存加上内存存储的配置,避免默认配置导致的初始化异常:
<cache-container name="DataCache" default-cache="modelcache" statistics-enabled="false"> <local-cache name="modelcache" statistics-enabled="false"> <!-- 明确堆内缓存的最大条目数和淘汰策略 --> <memory max-count="10000" when-full="REMOVE"/> <!-- 要是需要持久化可以加file-store,不需要就注释掉 --> <!-- <file-store path="modelcache-store" passivation="true"/> --> </local-cache> </cache-container>
3. 确保EJB初始化时机正确
你用了@Startup单例EJB,建议把缓存的验证逻辑放到@PostConstruct方法里,而不是依赖字段注入的时机,这样能明确看到缓存是否初始化成功:
@Singleton @Startup public class CacheManagerBean { @Resource(lookup = "java:jboss/infinispan/cache/DataCache/modelcache") private Cache<String, Object> modelCache; @PostConstruct public void initAndVerifyCache() { if (modelCache == null) { throw new IllegalStateException("Failed to lookup modelcache from Infinispan container!"); } // 加个测试操作验证缓存可用 modelCache.put("mig-test", "wildfly-12-mig-success"); String testVal = (String) modelCache.get("mig-test"); System.out.println("Cache initialization test: " + testVal); } }
4. 查看Wildfly日志定位深层问题
要是上面的步骤都试过还是不行,直接去Wildfly的standalone/log/server.log里找错误信息,比如:
- Infinispan容器初始化失败的异常
- JNDI查找时的
NoSuchObjectException - EJB初始化时的依赖注入错误
这些日志会直接告诉你问题根源,比如配置语法错了、权限不足或者类加载冲突。
内容的提问来源于stack exchange,提问作者Raj Kumar
相关产品推荐
相关产品推荐

