番石榴18.0 refreshAfterWrite

时间:2015-06-17 14:47:56

标签: java guava

Guava 18.0。

我正在尝试解决 refreshAfterWrite

使用以下代码,我认为

 return the **key on load** 
 after 3 seconds
 return update the key to uppercase (automatically)

这是装载机

 ExecutorService executor = Executors.newCachedThreadPool();
    mockLoader = new CacheLoader<String, String>() {
        //return key
        @Override
        public String load(String key) throws Exception {
            System.out.println("loaindg.....");
            return key;
        }
        // load-behind. asyn loading.
        @Override
        public ListenableFuture<String> reload(final String key, String result) {
            ListenableFutureTask<String> task = ListenableFutureTask.create(new Callable<String>() {
                public String call() {
                    System.out.println("reloaindg.....");
                    return key.toUpperCase();
                }
            });
            executor.execute(task);
            return task;
        }
    };
}

这是缓存

cache.setRefreshAfterWrite(3);
cache.setCacehLoader(mockLoader);

但在测试中,重新加载并未按预期发生。

String key = "a";
String firstGet = cache.get(key);
assertTrue(key.equals(firstGet));
sleep(refrehTime + 3);
// I must use the get to trigger the reload
String secondGet = cache.get(key);
assertTrue(key.toUpperCase().equals(secondGet));

这是正确的吗?

是否可以自动触发重新加载?

1 个答案:

答案 0 :(得分:0)

这是由于在执行程序上异步执行刷新,这允许读取是非阻塞的并返回过时值。如果您使用MoreExecutors.directExecutor(),则测试将通过。另请注意,您可以使用FakeTicker来操纵时间而不是睡觉。或者,您可能更喜欢使用到期而不是刷新。

  

到期和刷新密切相关但机制不同。过期的条目被认为是陈旧的,无法使用,因此必须将其丢弃并重新获取。有资格刷新的条目意味着内容仍然有效,但应该重新获取数据,因为它可能已过期。 Guava以名称expireAfterWrite和refreshAfterWrite提供这些TTL策略,如果刷新时间小于到期时间,则可以一起使用。

     

回答scalacache memoization asynchronous refresh