package io.kaif.config; import java.util.concurrent.TimeUnit; import org.springframework.cache.CacheManager; import org.springframework.cache.annotation.EnableCaching; import org.springframework.cache.guava.GuavaCacheManager; import org.springframework.cache.support.CompositeCacheManager; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.EnableAspectJAutoProxy; import org.springframework.context.annotation.Primary; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.security.crypto.password.PasswordEncoder; import com.google.common.cache.CacheBuilder; @Configuration @EnableCaching @EnableAspectJAutoProxy(proxyTargetClass = true) public class UtilConfiguration { @Bean public PasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder(); } @Bean @Primary public CacheManager compositeCacheManager() { return new CompositeCacheManager(zoneInfoCacheManager(), listHotZonesCacheManager(), rssHotArticlesCacheManager(), honorRollsCacheManager(), articleCacheManager(), findClientAppUserCacheManager(), listAdministratorsCacheManager()); } @Bean public CacheManager rssHotArticlesCacheManager() { CacheBuilder<Object, Object> cacheBuilder = CacheBuilder.newBuilder() .expireAfterWrite(4, TimeUnit.HOURS) .maximumSize(100); GuavaCacheManager cacheManager = new GuavaCacheManager("rssHotArticles"); cacheManager.setCacheBuilder(cacheBuilder); return cacheManager; } @Bean public CacheManager zoneInfoCacheManager() { CacheBuilder<Object, Object> cacheBuilder = CacheBuilder.newBuilder() .expireAfterWrite(10, TimeUnit.MINUTES) .maximumSize(2000); GuavaCacheManager cacheManager = new GuavaCacheManager("ZoneInfo"); cacheManager.setCacheBuilder(cacheBuilder); return cacheManager; } @Bean public CacheManager articleCacheManager() { CacheBuilder<Object, Object> cacheBuilder = CacheBuilder.newBuilder() .expireAfterWrite(10, TimeUnit.MINUTES) .maximumSize(2000); GuavaCacheManager cacheManager = new GuavaCacheManager("Article"); cacheManager.setCacheBuilder(cacheBuilder); return cacheManager; } /** * hot zones cache, refresh every one hour. no need to distribute if we have multiple web servers * * @see {@link io.kaif.model.article.ArticleDao#listHotZonesWithCache(int, java.time.Instant)} */ @Bean public CacheManager listHotZonesCacheManager() { CacheBuilder<Object, Object> cacheBuilder = CacheBuilder.newBuilder() .expireAfterWrite(1, TimeUnit.HOURS) .maximumSize(1000); GuavaCacheManager cacheManager = new GuavaCacheManager("listHotZones"); cacheManager.setCacheBuilder(cacheBuilder); return cacheManager; } /** * administrators cache, refresh every one minutes. no need to distribute if we have multiple * web servers (user just not see new administrators) */ @Bean public CacheManager listAdministratorsCacheManager() { CacheBuilder<Object, Object> cacheBuilder = CacheBuilder.newBuilder() .expireAfterWrite(1, TimeUnit.MINUTES) .maximumSize(1000); GuavaCacheManager cacheManager = new GuavaCacheManager("listAdministrators"); cacheManager.setCacheBuilder(cacheBuilder); return cacheManager; } /** * short life client app user cache (the cache is Optional<ClientAppUser>), so this is not * distribute-able * * @see {@link io.kaif.model.clientapp.ClientAppDao#findClientAppUserWithCache} */ @Bean public CacheManager findClientAppUserCacheManager() { CacheBuilder<Object, Object> cacheBuilder = CacheBuilder.newBuilder() .expireAfterWrite(1, TimeUnit.MINUTES) .maximumSize(1000); GuavaCacheManager cacheManager = new GuavaCacheManager("findClientAppUser"); cacheManager.setCacheBuilder(cacheBuilder); return cacheManager; } @Bean public CacheManager honorRollsCacheManager() { CacheBuilder<Object, Object> cacheBuilder = CacheBuilder.newBuilder() .expireAfterWrite(1, TimeUnit.HOURS) .maximumSize(100); GuavaCacheManager cacheManager = new GuavaCacheManager("listHonorRoll"); cacheManager.setCacheBuilder(cacheBuilder); return cacheManager; } }