アプリの起動時に、〜20個の異なるキャッシュを初期化しました。
@Bean
public CacheManager cacheManager() {
SimpleCacheManager cacheManager = new SimpleCacheManager();
cacheManager.setCaches(Arrays.asList(many many names));
return cacheManager;
}
1時間ごとなど、一定の間隔ですべてのキャッシュをリセットしたい。スケジュールされたタスクの使用:
@Component
public class ClearCacheTask {
private static final Logger logger = LoggerFactory.getLogger(ClearCacheTask.class);
private static final DateTimeFormatter formatter = DateTimeFormat.forPattern("yyyy-MM-dd hh:mm:ss");
@Value("${clear.all.cache.flag}")
private String clearAllCache;
private CacheManager cacheManager;
@CacheEvict(allEntries = true, value="...............")
@Scheduled(fixedRate = 3600000, initialDelay = 3600000) // reset cache every hr, with delay of 1hr
public void reportCurrentTime() {
if (Boolean.valueOf(clearAllCache)) {
logger.info("Clearing all cache, time: " + formatter.print(DateTime.now()));
}
}
}
間違ってドキュメントを読んでいない限り、@CacheEvict
では、実際には乱雑になるキャッシュの名前を指定する必要があります。
@CacheEvict
を使用してすべてのキャッシュをクリアするにはどうすればよいですか?
私は@CacheEvict
を使用する代わりに、すべてのキャッシュをループ処理することを考えていました。
cacheManager.getCacheNames().parallelStream().forEach(name -> cacheManager.getCache(name).clear());
キャッシュマネージャーを使用して、スケジュールされたタスクを使用してすべてのキャッシュをクリアしました。
@Component
public class ClearCacheTask {
@Autowired
private CacheManager cacheManager;
@Scheduled(fixedRateString = "${clear.all.cache.fixed.rate}", initialDelayString = "${clear.all.cache.init.delay}") // reset cache every hr, with delay of 1hr after app start
public void reportCurrentTime() {
cacheManager.getCacheNames().parallelStream().forEach(name -> cacheManager.getCache(name).clear());
}
}
ジョブを完了します。
以下のevictCacheメソッドは、@ CacheEvictアノテーションを使用してfooCacheを削除します。
public class FooService {
@Autowired
private FooRespository repository;
@Cacheable("fooCache")
public List<Foo> findAll() {
return repository.findAll();
}
@CacheEvict(value="fooCache",allEntries=true)
public void evictCache() {
LogUtil.log("Evicting all entries from fooCache.");
}
}