gpt4 book ai didi

java - 如何在 Spring Boot 中调用函数后释放所有缓存数据

转载 作者:行者123 更新时间:2023-11-29 04:15:37 24 4
gpt4 key购买 nike

我使用的是启用了缓存的 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
}

或者注入(inject)缓存管理器并移除所有缓存

@Service
public class ServiceCacheManagerExample {

@Autowired
private CacheManager cacheManager;

public void clearAllCaches(){
for(String name:cacheManager.getCacheNames()){
cacheManager.getCache(name).clear();
}
}
}

根据更新问题更新答案

您在作业监听器上使用了错误的 @Configuration 注释。

关于java - 如何在 Spring Boot 中调用函数后释放所有缓存数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52552472/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com