2015-05-01 17 views
6

Google ổi hướng dẫn cho biết bộ nhớ cache hết hạn có thể được thử nghiệm với TickerỔi Mã cổ phiếu cache hết hạn

như hiểu biết của tôi, tôi có thể sử dụng nó để buộc một hết nhanh chóng. Tôi có phải không?

nhưng tôi đã thử trong mã sau đây và nó không hoạt động, bất kỳ đề xuất nào?

@Test 
public void expireAfterWriteTestWithTicker() throws InterruptedException { 
    Ticker t = new Ticker() { 
     @Override 
     public long read() { 
      return TimeUnit.MILLISECONDS.toNanos(5); 
     } 
    }; 
    //Use ticker to force expire in 5 millseconds 
    LoadingCache<String, String> cache = CacheBuilder.newBuilder() 
      .expireAfterWrite(20, TimeUnit.MINUTES).ticker(t).build(loader); 

    cache.getUnchecked("hello"); 
    assertEquals(1, cache.size()); 
    assertNotNull(cache.getIfPresent("hello")); 
    //sleep 
    Thread.sleep(10); 
    assertNull(cache.getIfPresent("hello")); //failed 

} 
+1

Thay vì ' Thread.sleep', tăng ticker hơn 20 phút. Ví dụ: xem [kiểm tra đơn vị] này (https://github.com/ben-manes/caffeine/blob/master/caffeine/src/test/java/com/github/benmanes/caffeine/cache/ExpireAfterWriteTest.java) –

+0

Cảm ơn. Giờ nó đã hoạt động. – user3644708

Trả lời

10

Chỉ cần tìm ra câu trả lời bằng bản thân mình

Mã cổ phiếu có thể được sử dụng để skip thời điểm đó, nhưng không phải là thời gian hết hạn

class FakeTicker extends Ticker { 

    private final AtomicLong nanos = new AtomicLong(); 

    /** Advances the ticker value by {@code time} in {@code timeUnit}. */ 
    public FakeTicker advance(long time, TimeUnit timeUnit) { 
     nanos.addAndGet(timeUnit.toNanos(time)); 
     return this; 
    } 

    @Override 
    public long read() { 
     long value = nanos.getAndAdd(0); 
     System.out.println("is called " + value); 
     return value; 
    } 
} 

@Test 
public void expireAfterWriteTestWithTicker() throws InterruptedException { 
    FakeTicker t = new FakeTicker(); 

    // Use ticker to force expire in 20 minute 
    LoadingCache<String, String> cache = CacheBuilder.newBuilder() 
      .expireAfterWrite(20, TimeUnit.MINUTES).ticker(t).build(ldr); 
    cache.getUnchecked("hello"); 
    assertEquals(1, cache.size()); 
    assertNotNull(cache.getIfPresent("hello")); 

    // add 21 minutes 
    t.advance(21, TimeUnit.MINUTES); 
    assertNull(cache.getIfPresent("hello")); 

} 
+5

Lớp 'FakeTicker' nằm trên 'com.google.common.testing' –

Các vấn đề liên quan