我确实有一个类,它每分钟运行一个服务的cron作业,这是完全没有问题的。
服务@EnableCaching
@Service
@Qualifier("generalsearchrequests")
public class GeneralSearchCache implements ControlledCacheService {
private Logger log;
@Value("${cache.generalsearchrequests.clear}")
private String clear;
@Value("${cache.generalsearchrequests.clearintervall.in.milliseconds}")
private String delayInMs;
public GeneralSearchCache() {
super();
this.log = LoggerFactory.getLogger(GeneralSearchCache.class);
}
public String getKeyPrefix() {
// general
return "GSC";
}
public static String test(String value) {
return "coolerprefix" + "_" + value;
}
public String generateCacheKey(String value) {
return getKeyPrefix() + "_" + value;
}
@Override
@Cacheable(value = "generalsearchrequests", key = "T(....cache.GeneralSearchCache).test(#key)")
public String getCacheEntryByKey(String key) {
return null;
}
@Override
@CacheEvict(cacheNames = "generalsearchrequests", key = "T(....cache.GeneralSearchCache).test(#key)")
public void removeCacheEntryByKey(String key) {
}
@Override
@CachePut(value = "generalsearchrequests", key = "T(....smtransformer.cache.GeneralSearchCache).test(#key)")
public String insertIntoCache(String key, String value) {
return value;
}
@Override
@CacheEvict(allEntries = true, value = "generalsearchrequests")
public void clearCache() {
System.out.println("Flush Cache " + this.getCacheName() + " " + new Date());
}
@Override
public String getCacheName() {
return "generalsearchrequests";
}
}
运行方法的类
@Configuration
@EnableScheduling
@ConditionalOnProperty(name = "cache.generalsearchrequests.clear", havingValue = "true")
public class GeneralSearchCacheClearer extends ScheduledCacheClearer {
@Autowired
public GeneralSearchCacheClearer(@Qualifier("generalsearchrequests") ControlledCacheService ccs,
@Value("${cache.generalsearchrequests.clear}") String clear) {
super(ccs, Boolean.valueOf(clear));
}
@Override
@Scheduled(cron = "0 0-59 * * * *")
@Autowired
public void clearCache() {
System.out.println("CALLING CLEAR CACHE BY GeneralSearchCacheClearer...");
super.clearCache();
}
}
public abstract class ScheduledCacheClearer {
ControlledCacheService ccs;
boolean clear;
public ScheduledCacheClearer(ControlledCacheService ccs, boolean clear) {
this.ccs = ccs;
this.clear = clear;
}
public void clearCache() {
if (clear) {
ccs.clearCache();
}
}
}
系统按设置每分钟的日志:
CALLING CLEAR CACHE BY GeneralSearchCacheClearer...
Flush Cache generalsearchrequests Tue Jan 19 16:50:00 CET 2021
2021-01-19 16:50:00.001 TRACE 32327 --- [ scheduling-1] o.s.cache.interceptor.CacheInterceptor : Invalidating entire cache for operation Builder[public void -....GeneralSearchCache.clearCache()] caches=[generalsearchrequests] | key='' | keyGenerator='' | cacheManager='' | cacheResolver='' | condition='',true,false on method public abstract void ....ControlledCacheService.clearCache()
如何防止在应用程序启动时执行该方法?
证明bean函数将在启动时执行的示例日志
2021-01-19 16:46:13.342 INFO 32327 --- [ restartedMain] applicationname : Starting Application
2021-01-19 16:46:13.342 INFO 32327 --- [ restartedMain] applicationname : The following profiles are active: ...
2021-01-19 16:46:13.552 INFO 32327 --- [ restartedMain] TomcatWebServer : Tomcat initialized with port(s): 8080 (http)
2021-01-19 16:46:13.552 INFO 32327 --- [ restartedMain] Http11NioProtocol : Initializing ProtocolHandler ["http-nio-0.0.0.0-8080"]
2021-01-19 16:46:13.552 INFO 32327 --- [ restartedMain] StandardService : Starting service [Tomcat]
2021-01-19 16:46:13.552 INFO 32327 --- [ restartedMain] StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.41]
2021-01-19 16:46:13.557 INFO 32327 --- [ restartedMain] o.a.c.c.C.[Tomcat-1].[localhost].[/] : Initializing Spring embedded WebApplicationContext
2021-01-19 16:46:13.557 INFO 32327 --- [ restartedMain] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 214 ms
2021-01-19 16:46:13.584 TRACE 32327 --- [ restartedMain] o.s.c.a.AnnotationCacheOperationSource : Adding cacheable method 'getCacheEntryByKey' with attribute: [Builder[public java.lang.String .cache.GeneralSearchCache.getCacheEntryByKey(java.lang.String)] caches=[generalsearchrequests] | key='T(....cache.GeneralSearchCache).test(#key)' | keyGenerator='' | cacheManager='' | cacheResolver='' | condition='' | unless='' | sync='false']
2021-01-19 16:46:13.586 INFO 32327 --- [ restartedMain] f.a.AutowiredAnnotationBeanPostProcessor : Autowired annotation should only be used on methods with parameters: public void .cachclearer.GeneralSearchCacheClearer.clearCache()
CALLING CLEAR CACHE BY GeneralSearchCacheClearer...
2021-01-19 16:46:13.588 TRACE 32327 --- [ restartedMain] o.s.c.a.AnnotationCacheOperationSource : Adding cacheable method 'clearCache' with attribute: [Builder[public void .cache.GeneralSearchCache.clearCache()] caches=[generalsearchrequests] | key='' | keyGenerator='' | cacheManager='' | cacheResolver='' | condition='',true,false]
Flush Cache generalsearchrequests Tue Jan 19 16:46:13 CET 2021
我找到了这个问题的解决方案,根据启动时的消息
2021-01-19 16:46:13.586 INFO 32327 --- [ restartedMain] f.a.AutowiredAnnotationBeanPostProcessor : Autowired annotation should only be used on methods with parameters: public void .cachclearer.GeneralSearchCacheClearer.clearCache()
我以某种方式将autowired注释添加到GeneralSearchCacheClearer类的clearache方法中。删除它将导致在启动时不再调用该方法。
所以我修改了
中clearache方法的代码@Override
@Scheduled(cron = "0 0-59 * * * *")
@Autowired
public void clearCache() {
System.out.println("CALLING CLEAR CACHE BY GeneralSearchCacheClearer...");
super.clearCache();
}
}
@Override
@Scheduled(cron = "0 0-59 * * * *")
public void clearCache() {
System.out.println("CALLING CLEAR CACHE BY GeneralSearchCacheClearer...");
super.clearCache();
}
,它解决了这个问题,并删除了应用程序启动时的info日志。
cleararchache()每1分钟运行一次。启动时不运行。当然,导致它在开始时被调用的是ScheduledCacheClearer类中的逻辑。
多亏了ConditionalOnProperty(参见https://www.baeldung.com/spring-conditionalonproperty),你的GeneralSearchCacheClearer类只会在你的属性(havingValue中的cache.generalsearchrequests.clear = true时才会被使用。真正=,")。
可以看到,在构造函数中将true作为参数传递给基类。super (ccs, Boolean)。返回对象的值(清晰));
你能检查一下这个类是否调用了这个函数吗?