首页 > 解决方案 > 如何在 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();
        }
    }
}

标签: javaspring-bootspring-batchspring-cache

解决方案


您可以注释要调用的特定方法@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您在工作侦听器上使用了错误的注释。


推荐阅读