java - 如何在 Spring Boot 中的函数调用后释放所有缓存的数据
问题描述
我正在使用启用了缓存的 Spring Boot 2.0.4.RELEASE 版本,仅默认缓存提供程序没有使用外部缓存提供程序。
我已经安排了一个批次,每天在特定时间运行。在其运行期间,某些涉及数据访问的方法调用被缓存并且工作正常。
现在我想在预定时间下一次开始功能之前释放所有缓存的项目。
我无法实现此功能。你们能指导我一些想法或如何实现它。
这就是我想要实现的。我有一个标记为@Configuration 的 JobExecutionListener 类。我正在使用它的 afterJob 方法来清除所有缓存。
@Configuration
@JobScope
public class JobTwoExecutionListener implements JobExecutionListener {
private static final Logger logger = LoggerFactory.getLogger(JobTwoExecutionListener.class);
@Autowired
private CacheManager cacheManager;
@Override
public void beforeJob(JobExecution jobExecution) {
final String methodName = "beforeJob() : ";
logger.info(methodName + "called");
if(cacheManager == null) return;
logger.info(methodName + "CacheManager FOUND. Listing all the caches
before Job Run");
for(String name : cacheManager.getCacheNames()){
logger.info(methodName + "CACHE_NAME BEFORE JOB " + name);
}
}
@Override
public void afterJob(JobExecution jobExecution) {
final String methodName = "afterJob() : ";
logger.info(methodName + "called");
performCacheCleanup();
}
private void performCacheCleanup(){
final String methodName = "performCacheCleanup() : ";
logger.info(methodName + "called");
if(cacheManager == null){
logger.info(methodName + "CacheManager NOT FOUND");
return;
}
logger.info(methodName + "CacheManager FOUND. Listing & clearing all the caches after Job Run");
for(String name : cacheManager.getCacheNames()){
if(name == null) continue;
logger.info(methodName + "CLEARING CACHE " + name + " AFTER JOB");
Cache cache = cacheManager.getCache(name);
if(cache != null) cache.clear();
}
}
}
解决方案
您可以注释要调用的特定方法@CacheEvict
@CacheEvict(value = "cachename", allEntries=true)
public void doSomethingBeforeEvict(Object object) {
//do something, cache evicted after this method
}
或者注入缓存管理器并删除所有缓存
@Service
public class ServiceCacheManagerExample {
@Autowired
private CacheManager cacheManager;
public void clearAllCaches(){
for(String name:cacheManager.getCacheNames()){
cacheManager.getCache(name).clear();
}
}
}
根据更新问题更新答案
@Configuration
您在工作侦听器上使用了错误的注释。
推荐阅读
- java - 如何使用 maven 命令运行 Test dependsOnGroups
- wordpress - 从注册页面中删除电子邮件
- java - Lombok 的 @Builder 和 Javadoc 创建
- python - 使用 Snowflake Python 连接器查询 Snowflake 样本数据时出现 UTF-8 解码错误
- java - 将 0 到 255(1 字节)范围的 10 个不同值编码为 3 字节长度值并将其恢复为原始值
- javascript - 如何使用 Wikipedia 的 URL 获取 Wikipedia 内容?
- python - 根据数据框中的值从字典中删除嵌套的键值对
- asp.net-core - ASP.NET Core Web API 操作的永久不记名令牌身份验证
- python - conda环境需要pipwin
- c# - 在不使用开始表单或帖子的情况下将文本框的值获取到视图组件中