Google Guava教程称缓存过期可以用
Ticker进行测试
根据我的理解,我可以用它来强制快速过期.我对吗?
但我试过以下代码,它没有用,有什么建议吗?
- @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
- }
解决方法
只要自己找到答案
Ticker可用于跳过时间,但不能用于到期时间
- 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,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"));
- }