最近我遇到了一个问题,Infinispan8.2.1,issue。我有一些使用配置的缓存加载程序在失效模式下的读缓存。该缓存的配置由两部分组成。第一部分是XML中的以下模板:
<?xml version="1.0" encoding="UTF-8"?>
<infinispan xmlns="urn:infinispan:config:8.2">
<cache-container default-cache="default">
<transport cluster="jcache-cluster"/>
<invalidation-cache-configuration name="user" mode="SYNC" statistics="true"/>
</cache-container>
</infinispan>第二部分是使用来自JCache API的类和接口的编程配置:
new MutableConfiguration<String, User>()
.setReadThrough(true).setStoreByValue(true)
.setCacheLoaderFactory(FactoryBuilder.factoryOf(UserCacheLoader.class));UserCacheLoader非常简单。每次调用User时,它都会创建一个新的实例。
在我调用javax.cache.Cache.removeAll()方法之前,一切都很好。它导致以下异常:
Caused by: java.lang.ClassCastException: org.infinispan.test.User cannot be cast to java.lang.String
at org.infinispan.test.UserCacheLoader.load(UserCacheLoader.java:40)
at org.infinispan.jcache.embedded.JCacheLoaderAdapter.loadKey(JCacheLoaderAdapter.java:65)
... 40 more经过一番调查,我在org.infinispan.jcache.embedded.JCacheLoaderAdapter类中找到了以下代码
@Override
public MarshalledEntry load(Object key) throws PersistenceException {
V value = loadKey(key);
if (value != null) {
Duration expiry = Expiration.getExpiry(expiryPolicy, Expiration.Operation.CREATION);
long now = ctx.getTimeService().wallClockTime(); // ms
if (expiry == null || expiry.isEternal()) {
return ctx.getMarshalledEntryFactory().newMarshalledEntry(value, value, null);
} else {
long exp = now + expiry.getTimeUnit().toMillis(expiry.getDurationAmount());
JCacheInternalMetadata meta = new JCacheInternalMetadata(now, exp);
return ctx.getMarshalledEntryFactory().newMarshalledEntry(value, value, meta);
}
}
return null;
}如您所见,使用newMarshalledEntry作为键和值调用value。
是窃听器还是特征?有谁面临同样的问题吗?
这一问题似乎也适用于最新版本的英飞凌。
发布于 2017-05-04 14:27:58
这确实是一个错误,现在已经由@brianheart :)解决了。它将包含在下一个版本中。
https://stackoverflow.com/questions/43679623
复制相似问题