我需要一个失败条目的缓存,我试图使用以下语句构建:
failedJobCache =
CacheBuilder.newBuilder()
.maximumSize(100) // maximum 100 records can be cached
.expireAfterAccess(30, TimeUnit.MINUTES) // cache will expire after 30 minutes of access
.build(new CacheLoader<String, JobDto>() {
@Override
public JobDto load(String s) throws Exception {
JobDto found = failedJobCache.get(s);
if (found != null)
return found;
else
return null;
}
});
和
// add failed entries
failedJobCache.put(jobDto.getUniqueId(), jobDto);
// respective check before running the job if its
// already in the cache and should be skipped:
JobDto existing = failedJobCache.get(jobDto.getUniqueId());
if (existing != null) {
logger.debug("Nothing to do, job already processed!" + jobDto.getUniqueId());
return;
}
不幸的是我遇到了:
线程中的异常&#34; main&#34; com.google.common.util.concurrent.UncheckedExecutionException:java.lang.IllegalStateException:递归加载:...
问题如何仅将失败的条目添加到缓存中?
答案 0 :(得分:1)
CacheLoader.load(K)
)时才会调用{p> CacheBuilder.build(LoadingCache)
。
因此,从CacheLoader.load(K)
调用LoadingCache.get(K)
会创建一个递归加载,如果允许执行,则会递归太深而导致StackOverflowError
被抛出。
根据您示例中提供的信息,您似乎不需要LoadingCache<K, V>
而只需Cache<K, V>
。如果没有CacheBuilder.build()
,请致电CacheLoader<K, V>
。
有关详细信息,请参阅CachesExplained · google/guava Wiki。
答案 1 :(得分:0)
加载函数似乎有一个递归。当您尝试在缓存中加载条目并且加载器函数中的某个位置尝试再次调用它时,会发生这种情况。
您可以调试并识别进行此类调用的方法。