Spring 引导没有 运行 调度器 @Scheduled

Spring boot doesn't run scheduler @Scheduled

我在我的项目配置 bean 中使用了缓存逐出,但它没有运行。我在其他项目中使用了一些 class 并且工作正常,但我不知道现在问题出在哪里。

@Configuration
@Slf4j
public class CacheConfig {

    public static final String BANKCODE_CACHE_NAME = "cacheName";

    @CacheEvict(allEntries = true, cacheNames = { CACHE_NAME })
    @Scheduled(fixedRate = 5000)
    public void cachePosEvict() {
        log.info("Evicting cache: {}", CACHE_NAME);
    }

}

问题可能出在这个配置 bean 的其他地方,因为当我使用时也是如此:

@PostConstruct
void init() {
    log.info("Init...");
}

然后日志中没有任何内容。我查看了 TRACE spring 日志,没有错误,class 在 class 路径中。 我不知道哪里会出问题。

我在 gradle 中有以下依赖项:

plugins {
    id 'org.springframework.boot' version '2.3.1.RELEASE'
    id 'io.spring.dependency-management' version '1.0.9.RELEASE'
    id 'java'
}

ext {
    set('springCloudVersion', "Hoxton.SR6")
    webfluxUiVersion = "1.3.9"
    jacksonVersion = "2.10.1"
    logbackJson = "0.1.5"
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-webflux'
    implementation 'org.springframework.cloud:spring-cloud-starter-gateway'
    implementation 'org.springframework.boot:spring-boot-starter-actuator'
    implementation 'org.springframework.cloud:spring-cloud-starter-netflix-hystrix'
    implementation 'org.springframework.boot:spring-boot-starter-validation'
    implementation "org.springdoc:springdoc-openapi-webflux-ui:${webfluxUiVersion}"


    implementation "com.fasterxml.jackson.core:jackson-core:${jacksonVersion}"
    implementation "com.fasterxml.jackson.core:jackson-databind:${jacksonVersion}"
    implementation "com.fasterxml.jackson.core:jackson-annotations:${jacksonVersion}"
    implementation "com.fasterxml.jackson.dataformat:jackson-dataformat-xml:${jacksonVersion}"

    implementation "ch.qos.logback.contrib:logback-json-classic:${logbackJson}"
    implementation "ch.qos.logback.contrib:logback-jackson:${logbackJson}"

我使用 Java 11 和 Main class:

@ConfigurationPropertiesScan
@SpringBootApplication
@EnableCaching
@EnableScheduling
public class MyApp{...}

编辑: 我发现问题出在我的配置中:

main:
    lazy-initialization: true

我以为bean会在Scheduler激活的时候创建。

看起来您正在使用 webflux,您可能需要 return 可以订阅的发布者(Mono 或 Flux),例如:

public Mono<Void> cachePosEvict() {
    log.info("Evicting cache: {}", CACHE_NAME);
}

您定期从缓存中清除所有条目。要么你有一个非常具体的用例,要么你做错了。

我假设您使用 Caffeine 实现。在这种情况下,请考虑通过专用 属性:

配置缓存过期
spring.cache.caffeine.spec=expireAfterWrite=5s

更多信息在这里:

https://docs.spring.io/spring-boot/docs/current/reference/html/appendix-application-properties.html#cache-properties

解决方案是禁用功能:

spring:
   main:
     lazy-initialization: false