[英]ClassCastException while reading from Infinispan Cache after redeployment on Wildfly 8.2
我在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中查找Cache,如下所示:
@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嘗試轉換使用前一個類加載器存儲的實體,該實體無法工作。 但是如何避免這種情況呢?
不要使用start =“EAGER”。 這將解決您的問題。 我們已經從WildFly 9中刪除了它,因為它的誤用是許多用戶頭痛的根源。
另外,我建議直接注入緩存(而不僅僅是緩存容器)。 這樣,緩存生命周期將綁定到部署的生命周期。 例如
@Resource(lookup = "java:jboss/infinispan/cache/myContainer/myCache")
private Cache<Integer, MyCacheObject> myCache;
最后,隨意使用resource-ref以避免在應用程序中引用特定於供應商的jndi名稱空間。
如果在Infinispan配置中啟用store-as-binary
並強制緩存使用應用程序的類加載器而不是GlobalConfiguration
的類加載器,則應該能夠共享緩存:
Cache appSpecificCache = cacheFromJndi.getAdvancedCache().with(applicationClassLoader)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.