弹簧-防止启动时执行计划方法



我确实有一个类,它每分钟运行一个服务的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)。返回对象的值(清晰));

你能检查一下这个类是否调用了这个函数吗?

最新更新