如何用条目加载番石榴

时间:2016-03-18 09:20:28

标签: java guava

我需要一个失败条目的缓存,我试图使用以下语句构建:

    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:递归加载:...

问题如何仅将失败的条目添加到缓存中?

2 个答案:

答案 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)

加载函数似乎有一个递归。当您尝试在缓存中加载条目并且加载器函数中的某个位置尝试再次调用它时,会发生这种情况。

您可以调试并识别进行此类调用的方法。