Package org.springside.examples.showcase.demos.cache.guava

Source Code of org.springside.examples.showcase.demos.cache.guava.GuavaCacheDemo

/*******************************************************************************
* Copyright (c) 2005, 2014 springside.github.io
*
* Licensed under the Apache License, Version 2.0 (the "License");
*******************************************************************************/
package org.springside.examples.showcase.demos.cache.guava;

import static org.assertj.core.api.Assertions.*;

import java.util.concurrent.TimeUnit;

import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springside.examples.showcase.entity.User;
import org.springside.examples.showcase.service.AccountService;
import org.springside.modules.test.data.DataFixtures;
import org.springside.modules.test.log.LogbackListAppender;
import org.springside.modules.test.spring.SpringTransactionalTestCase;
import org.springside.modules.utils.Threads;

import com.google.common.cache.CacheBuilder;
import com.google.common.cache.CacheLoader;
import com.google.common.cache.LoadingCache;

/**
* 本地缓存演示,使用GuavaCache.
*
* @author calvin
*/
@ContextConfiguration(locations = { "/applicationContext.xml" })
public class GuavaCacheDemo extends SpringTransactionalTestCase {

  @Autowired
  private AccountService accountService;

  @Test
  public void demo() throws Exception {
    // 设置缓存最大个数为100,缓存过期时间为5秒
    LoadingCache<Long, User> cache = CacheBuilder.newBuilder().maximumSize(100)
        .expireAfterAccess(5, TimeUnit.SECONDS).build(new CacheLoader<Long, User>() {
          @Override
          public User load(Long key) throws Exception {
            logger.info("fetch from database");
            return accountService.getUser(key);
          }

        });

    // 初始化数据
    DataFixtures.executeScript(dataSource, "classpath:data/h2/cleanup-data.sql",
        "classpath:data/h2/import-data.sql");

    // 插入appender用于assert。
    LogbackListAppender appender = new LogbackListAppender();
    appender.addToLogger(GuavaCacheDemo.class);

    // 第一次加载会查数据库
    User user = cache.get(1L);
    assertThat(user.getLoginName()).isEqualTo("admin");
    assertThat(appender.isEmpty()).isFalse();
    appender.clearLogs();

    // 第二次加载时直接从缓存里取
    User user2 = cache.get(1L);
    assertThat(user2.getLoginName()).isEqualTo("admin");
    assertThat(appender.isEmpty()).isTrue();

    // 第三次加载时,因为缓存已经过期所以会查数据库
    Threads.sleep(10, TimeUnit.SECONDS);
    User user3 = cache.get(1L);
    assertThat(user3.getLoginName()).isEqualTo("admin");
    assertThat(appender.isEmpty()).isFalse();
  }
}
TOP

Related Classes of org.springside.examples.showcase.demos.cache.guava.GuavaCacheDemo

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.