2015-05-27 48 views
4

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

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

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

我查找缓存的CDI豆这样的:

@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试图将存储在前一个类加载器中的实体转换为无法工作的实体。但如何避免这种情况?

+0

您可以发布完整的堆栈跟踪在要点或pastebin?你的Wildfly配置是什么样的? –

+0

添加了堆栈跟踪和配置。任何想法@GalderZamarreño? – markus

回答

2

不要使用start =“EAGER”。这将解决您的问题。 我们已经从WildFly 9中删除了它,因为它的误用一直是许多用户头痛的源头。

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

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

最后,随意使用资源引用,以避免在您的应用程序中引用一个特定供应商的JNDI名称空间。

+0

感谢您的提示。如果我使用start =“LAZY”,重新部署问题就消失了。但仅仅是因为缓存在重新部署期间被驱逐。先前存储的对象不见​​了。我仍然无法从另一个EAR/WAR访问缓存。它仍然会抛出ClassCastException。 – markus

0

你应该可以,如果你能够在Infinispan的配置store-as-binary共享高速缓存,并且强制高速缓存使用,而不是一个在GlobalConfiguration应用程序的类加载器:

Cache appSpecificCache = cacheFromJndi.getAdvancedCache().with(applicationClassLoader) 
相关问题