首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如果配置了带有缓存加载器的只读缓存,则使用ClassCastException。

如果配置了带有缓存加载器的只读缓存,则使用ClassCastException。
EN

Stack Overflow用户
提问于 2017-04-28 11:55:09
回答 1查看 183关注 0票数 0

最近我遇到了一个问题,Infinispan8.2.1,issue。我有一些使用配置的缓存加载程序在失效模式下的读缓存。该缓存的配置由两部分组成。第一部分是XML中的以下模板:

代码语言:javascript
复制
<?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的类和接口的编程配置:

代码语言:javascript
复制
new MutableConfiguration<String, User>()
    .setReadThrough(true).setStoreByValue(true)
    .setCacheLoaderFactory(FactoryBuilder.factoryOf(UserCacheLoader.class));

UserCacheLoader非常简单。每次调用User时,它都会创建一个新的实例。

在我调用javax.cache.Cache.removeAll()方法之前,一切都很好。它导致以下异常:

代码语言:javascript
复制
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类中找到了以下代码

代码语言:javascript
复制
@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

是窃听器还是特征?有谁面临同样的问题吗?

这一问题似乎也适用于最新版本的英飞凌。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-05-04 14:27:58

这确实是一个错误,现在已经由@brianheart :)解决了。它将包含在下一个版本中。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43679623

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档