Как освободить все кэшированные данные после вызова функции в Spring Boot - PullRequest
0 голосов
/ 28 сентября 2018

Я использую версию Spring Boot 2.0.4.RELEASE с включенным кэшем только с поставщиком кэша по умолчанию. Внешний поставщик кэша не используется.

Я запланировал запуск пакета в определенное время каждый день.Во время его выполнения некоторые вызовы методов, которые включают доступ к данным, кэшируются и работают нормально.

Теперь я хочу освободить все кэшированные элементы перед следующим запуском функции в назначенное время.

IЯ не могу реализовать эту функцию.Можете ли вы привести меня к нескольким идеям или способам их реализации.

Это то, что я пытаюсь реализовать.У меня есть класс JobExecutionListener, помеченный как @Configuration.Я использую метод 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();
        }
    }
}

Ответы [ 3 ]

0 голосов
/ 29 сентября 2018

Вы можете аннотировать определенный метод для вызова с помощью @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 в прослушивателе своей работы.

0 голосов
/ 01 октября 2018

Заполнение / очистка кэша - типичный вариант использования JobExecutionListener.В вашем случае вы можете создать пользовательский прослушиватель и очистить кеш в методе afterJob, например:

@Component
class MyJobExecutionListener extends JobExecutionListenerSupport {

    private CacheManager cacheManager;

    public MyJobExecutionListener(CacheManager cacheManager) {
        this.cacheManager = cacheManager;
    }

    @Override
    public void afterJob(JobExecution jobExecution) {
        cacheManager.getCache("mycache").clear();
    }
}

Таким образом, кеш будет очищен при выполнении задания в следующий запланированный раз.

Вы также можете создать шаг тасклета, который очистит кеш и добавит его в качестве последнего шага вашей работы.

Есть похожий вопрос к этому, я добавляю его здесьдля справки: Spring Batch с аннотацией и кэшированием .

0 голосов
/ 28 сентября 2018

перед повторным вызовом пакета просто выполните

session.evict(Object)

. Он очистит весь предыдущий кэш, связанный с этим объектом.

Вы также можете выполнить session.clear () для его удаленияполностью

...