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));
这是正确的吗?
是否可以自动触发重新加载?
答案 0 :(得分:0)
这是由于在执行程序上异步执行刷新,这允许读取是非阻塞的并返回过时值。如果您使用MoreExecutors.directExecutor()
,则测试将通过。另请注意,您可以使用FakeTicker
来操纵时间而不是睡觉。或者,您可能更喜欢使用到期而不是刷新。
到期和刷新密切相关但机制不同。过期的条目被认为是陈旧的,无法使用,因此必须将其丢弃并重新获取。有资格刷新的条目意味着内容仍然有效,但应该重新获取数据,因为它可能已过期。 Guava以名称expireAfterWrite和refreshAfterWrite提供这些TTL策略,如果刷新时间小于到期时间,则可以一起使用。