2013-03-07 2 views
2

Почему timedCachetest не работает на последней строке? Почему кеш не пуст через 60 секунд?Зачем устанавливать expireAfterAccess не работает?

package com.test.cache; 

import java.util.concurrent.TimeUnit; 

import junit.framework.Assert; 

import org.junit.After; 
import org.junit.Before; 
import org.junit.Test; 

import com.google.common.cache.Cache; 
import com.google.common.cache.CacheBuilder; 

public class CacheTest { 
    private static final int MAXIMUM_SIZE = 10; 
    private static final int CONCURRENCY_LEVEL = 1; 
    private static final long EXPIRE_AFTER_ACCESS = 60; 
    Cache<String, Thing> cache; 
    private static TimeUnit unit = TimeUnit.SECONDS; 
    private static long sec = 1000; 

    @Before 
    public void setUp() throws Exception { 
     cache = CacheBuilder.newBuilder().maximumSize(MAXIMUM_SIZE).concurrencyLevel(CONCURRENCY_LEVEL).expireAfterAccess(EXPIRE_AFTER_ACCESS, unit).build(); 
    } 

    @After 
    public void tearDown() { 
     cache = null; 
    } 

    @Test 
    public void simpleCachetest() { 
     String key = "key"; 
     Integer hc = key.hashCode(); 
     Thing thing = new Thing(key); 
     cache.put(key, thing); 
     thing = cache.getIfPresent(key); 
     Assert.assertNotNull(thing); 
     Assert.assertEquals(hc, thing.getValue()); 
     Assert.assertEquals(key, thing.getName()); 
     Assert.assertEquals(1, cache.size()); 
    } 

    @Test 
    public void timedCachetest() { 
     String key = "key"; 
     Thing thing = new Thing(key); 
     Assert.assertEquals(0, cache.size()); 
     cache.put(key, thing); 
     Assert.assertEquals(1, cache.size()); 
     try { 
      thing = cache.getIfPresent(key); 
      long millis = 100 * sec; 
      Thread.sleep(millis); 
      // cache.invalidateAll(); 
     } catch (InterruptedException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     Assert.assertNotNull(thing); 
     Assert.assertEquals(key, thing.getName()); 
     Assert.assertEquals(0, cache.size()); 
    } 

    class Thing { 
     public Thing(String key) { 
      this.name = key; 
      this.value = key.hashCode(); 
     } 

     public String getName() { 
      return name; 
     } 

     public Integer getValue() { 
      return value; 
     } 

     private String name; 
     private Integer value; 
    } 
} 

ответ

9

Он заявил прямо в CacheBuilder Javadoc:

Если expireAfterWrite или expireAfterAccess испрашивается запись может быть выселена по каждой модификации кэша, на случайном кэш доступа, или на вызовы Cache.cleanUp (). Истекшие записи могут быть подсчитаны в Cache.size(), но никогда не будут видны для операций чтения или записи.

CacheBuilder кэши сделать обслуживание либо когда он специально просил, или когда он может сделать это в рамках мутации кэша, или время от времени на чтение. Это не означает, например, запустите поток для обслуживания кешей, потому что a) потоки относительно тяжеловесы и b) некоторые среды ограничивают создание потоков.

+3

Спасибо, что прочитали инструкцию для меня. ;) Может быть, я должен удалить этот вопрос. – hash

Смежные вопросы