首页 > 解决方案 > spring boot调度在方法级别启用/禁用任务

问题描述

我正在按照本指南开始在 Spring Boot https://spring.io/guides/gs/scheduling-tasks/中安排任务。

我想为同一个类中的不同任务添加更多方法,想知道是否可以通过属性启用/禁用方法级别的任务,并且@ConditionalOnProperty似乎@ConditionalOnProperty仅适用于类级别,而不是方法级别(根据下面的代码示例,它不起作用)。任何替代方法?还是必须创建另一个包含任务二的类才能分别禁用/启用它们?

@Component    
public class SchedulingTasks {

    private static final Logger log =    LoggerFactory.getLogger(SchedulingTasks.class);

    @Scheduled(fixedRate = 50000)
    public void jobOne() {
        log.info("job one started at {}", LocalDateTime.now());
    }

    @Scheduled(fixedRate = 50000)
    @ConditionalOnProperty(name="job.two", havingValue="true")  
    public void jobTwo() {
        log.info("just two started at {}", LocalDateTime.now());
    }
}

标签: javaspring-bootscheduled-tasks

解决方案


您可以应用于@ConditionalOnProperty方法和类型,但似乎这只适用于注册 Bean 的方法(请参阅@Conditional文档)。

您应该创建单独的 Bean,您可以在其中使用 @ConditionalOnProperty 控制注册,然后将@Scheduled注释应用于 Bean 中的方法。

例子:

@Slf4j
@Service
@ConditionalOnProperty(prefix = "schedule", name = {"job.one"}, havingValue = "true")
public class JobOneScheduler {

    @Scheduled(cron = "*/2 * * * * *")
    public void runJob() {
        log.debug( "Running job one... {}", LocalDateTime.now() );
    }
}


@Slf4j
@Service
@ConditionalOnProperty(prefix = "schedule", name = {"job.two"}, havingValue = "true")
public class JobTwoScheduler {
    @Scheduled(cron = "*/5 * * * * *")
    public void runJob() {
        log.debug( "Running job two... {}", LocalDateTime.now() );
    }
}

应用程序属性:

schedule.job.one=true
schedule.job.two=false

推荐阅读