簡體   English   中英

番石榴18.0 refreshAfterWrite

[英]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,如果刷新時間小於到期時間,則可以將它們一起使用。

回答Scalacache記憶化異步刷新

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM