[英]Guava 18.0 refreshAfterWrite
番石榴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));
這個對嗎?
有可能自動觸發重新加載嗎?
這是由於在執行程序上異步執行刷新,這使讀取成為非阻塞狀態並返回陳舊的值。 如果使用MoreExecutors.directExecutor()
則測試將通過。 另請注意,您可以使用FakeTicker
來操縱時間而不是睡覺。 另外,您可能更喜歡使用到期日期而不是刷新。
到期和刷新密切相關,但是機制不同。 過期的條目被視為過時的,無法使用,因此必須將其丟棄並重新獲取。 符合刷新條件的條目表示內容仍然可以使用,但應重新提取數據,因為它可能已過期。 番石榴提供這些TTL策略的名稱為expireAfterWrite和refreshAfterWrite,如果刷新時間小於到期時間,則可以將它們一起使用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.