Nit*_*mar 1 java spring-batch spring-boot spring-cache
我正在使用 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();
}
}
}
Run Code Online (Sandbox Code Playgroud)
您可以使用注释来调用特定方法@CacheEvict
@CacheEvict(value = "cachename", allEntries=true)
public void doSomethingBeforeEvict(Object object) {
//do something, cache evicted after this method
}
Run Code Online (Sandbox Code Playgroud)
或者注入缓存管理器并删除所有缓存
@Service
public class ServiceCacheManagerExample {
@Autowired
private CacheManager cacheManager;
public void clearAllCaches(){
for(String name:cacheManager.getCacheNames()){
cacheManager.getCache(name).clear();
}
}
}
Run Code Online (Sandbox Code Playgroud)
根据更新问题更新答案
@Configuration您在作业侦听器上使用了错误的注释。