Spring Boot 函数调用后如何释放所有缓存数据
How to release all cached data after a function call in Spring Boot
我正在使用 Spring Boot 2.0。4.RELEASE 版本启用了缓存,仅使用默认缓存提供程序没有使用外部缓存提供程序。
我安排了一批 运行 在每天的特定时间。在其 运行 期间,某些涉及数据访问的方法调用被缓存并且工作正常。
现在我想在预定的时间在下一次函数启动之前释放所有缓存项。
我无法实现此功能。你们能不能指导我一些想法或如何实施它。
这就是我要实现的。我有一个标记为 @Configuration 的 JobExecutionListener class。我正在使用它的 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();
}
}
}
在再次调用您的批次之前,只需执行
session.evict(Object)
它将清除与该对象关联的所有先前缓存。
您也可以执行 session.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
注释。
Populating/Clearing 缓存是 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();
}
}
这样,当您的作业在下一个预定时间执行时,缓存将被清除。
您还可以创建一个清除缓存的 tasklet 步骤,并将其添加为作业的最后一步。
有个类似的问题,我在这里补充一下:。
我正在使用 Spring Boot 2.0。4.RELEASE 版本启用了缓存,仅使用默认缓存提供程序没有使用外部缓存提供程序。
我安排了一批 运行 在每天的特定时间。在其 运行 期间,某些涉及数据访问的方法调用被缓存并且工作正常。
现在我想在预定的时间在下一次函数启动之前释放所有缓存项。
我无法实现此功能。你们能不能指导我一些想法或如何实施它。
这就是我要实现的。我有一个标记为 @Configuration 的 JobExecutionListener class。我正在使用它的 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();
}
}
}
在再次调用您的批次之前,只需执行
session.evict(Object)
它将清除与该对象关联的所有先前缓存。
您也可以执行 session.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
注释。
Populating/Clearing 缓存是 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();
}
}
这样,当您的作业在下一个预定时间执行时,缓存将被清除。
您还可以创建一个清除缓存的 tasklet 步骤,并将其添加为作业的最后一步。
有个类似的问题,我在这里补充一下: