Guava cache cache expiration

Google Guava tutorial says cache expiration can be tested with Ticker

as I understand it, I can use it to quickly expire. Am i right

but I tried in the following code and it didn't work, any suggestions?

@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 } 
+6
source share
1 answer

Just find the answer yourself

Ticker can be used to skip time, but not expiration time.

 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")); } 
+10
source

Source: https://habr.com/ru/post/986373/


All Articles