在 Wildfly 8.2 上重新部署后从 Infinispan 缓存读取时发生 ClassCastException

Posted

技术标签:

【中文标题】在 Wildfly 8.2 上重新部署后从 Infinispan 缓存读取时发生 ClassCastException【英文标题】:ClassCastException while reading from Infinispan Cache after redeployment on Wildfly 8.2 【发布时间】:2015-08-09 14:13:25 【问题描述】:

我在 Wildfly 8.2 上有一个简单的 Infinispan 本地缓存(也尝试过分布式缓存)。在我重新部署我的 .WAR 之前,一切正常。重新部署我的 .WAR 后,我收到以下错误:

Caused by: java.lang.ClassCastException: my.package.MyClass cannot be cast to my.package.MyClass

完整的堆栈跟踪:https://gist.github.com/bagges/07af1842a874f7c99ef3

我像这样在 CDI Bean 中查找缓存:

@Path("/mypath")
@Stateless
public class MyServiceClass 

    @Resource(lookup = "java:jboss/infinispan/myContainer")
    private CacheContainer container;

    private Cache<Integer, MyCacheObject> myCache;

    @PostConstruct
    public void start() 
        myCache = container.getCache("myCache");
    

    @GET
    public String get() 
        if(!myCache.containsKey(1)) 
            myCache.put(1, new MyCacheObject(1, "Hello Cache"));
        
        return myCache.get(1).getName();
    

Wildfly-配置:

<cache-container name="myContainer" jndi-name="java:jboss/infinispan/myContainer" start="EAGER">
    <local-cache name="myCache"/>
</cache-container>

我知道发生错误是因为关闭了不同的类加载器。 Infinispan 尝试强制转换使用先前无法工作的类加载器存储的实体。但是如何避免呢?

【问题讨论】:

您可以在 gist 或 pastebin 上发布完整的堆栈跟踪吗?您的 Wildfly 配置是什么样的? 添加了堆栈跟踪和配置。任何想法@GalderZamarreño? 【参考方案1】:

不要使用 start="EAGER"。这将解决您的问题。 我们已将其从 WildFly 9 中删除,因为它的滥用已成为许多用户头痛的根源。

另外,我建议直接注入缓存(而不仅仅是缓存容器)。这样,缓存生命周期将绑定到部署的生命周期。 例如

@Resource(lookup = "java:jboss/infinispan/cache/myContainer/myCache")
private Cache<Integer, MyCacheObject> myCache;

最后,请随意使用资源引用来避免在您的应用程序中引用特定于供应商的 jndi 命名空间。

【讨论】:

感谢您的提示。如果我使用 start="LAZY",重新部署问题就消失了。但仅仅是因为缓存在重新部署期间被驱逐。之前存储的对象已经消失了。我仍然无法从另一个 EAR/WAR 访问缓存。它仍然会抛出 ClassCastException。【参考方案2】:

如果您在 Infinispan 配置中启用 store-as-binary 并强制缓存使用应用程序的类加载器而不是 GlobalConfiguration 中的类加载器,您应该能够共享缓存:

Cache appSpecificCache = cacheFromJndi.getAdvancedCache().with(applicationClassLoader)

【讨论】:

以上是关于在 Wildfly 8.2 上重新部署后从 Infinispan 缓存读取时发生 ClassCastException的主要内容,如果未能解决你的问题,请参考以下文章

Wildfly 8.2:缺少 component.CREATE

如何在wildfly 8.2 Final中将lib添加到模块中?

在 WildFly 上重新部署后,CDI 无法在 @Requestscoped REST 服务中将 @Singleton 设置为 @Provider

Spring Boot 2 重新部署到 Wildfly 10 后无法刷新 JMS 连接

如何打开 Wildfly 8.2 JMX 端口进行监控?

在 WildFly 中的重新部署之间保持 HTTP 会话