如何在春季通过个人资料启用@Scheduled作业?

时间:2015-02-28 14:14:49

标签: java spring spring-boot

如何仅在特定配置文件中启用预定作业?

伪代码:

@Scheduled(cron = "${job.cron}")
@Profile("prod")
public void runJob() {

}

这可能吗?

3 个答案:

答案 0 :(得分:10)

每个配置文件应该有一个bean:

@Component
@Profile("prod")
public class ProdJob {

    @Scheduled(cron = "${job.cron}")
    public void runJob() {

    }

}

@Component
@Profile("beta")
public class BetaJob {

    @Scheduled(cron = "${job.cron}")
    public void runJob() {

    }
}

答案 1 :(得分:3)

您可以使用以下方法进行操作。 几乎与您已经做过的一样,但是先添加冒号,然后添加默认值(如果找不到属性)。这里我们使用'-'作为cron disable表达式:

@Scheduled(cron = "${job.cron:-}")
public void runJob() {

}

然后在所需的配置文件中定义cron表达式(例如,使用属性文件)。

这是application-prod.properties的内容:

job.cron=*/30 * * * * *

在这里,产品简介文件将每30秒启动一次,对于其他所有产品,它都将关闭。

答案 2 :(得分:1)

我用的是spring boot 2.3.7版本,这个问题的解决方法和你提供的伪代码一样。你激励了他们的团队 :-).

// Enable sceduling
@Configuration
@EnableScheduling
public class SchedulerConfig implements SchedulingConfigurer {

    @Override
    public void configureTasks(ScheduledTaskRegistrar scheduledTaskRegistrar) {
        ThreadPoolTaskScheduler threadPoolTaskScheduler = new ThreadPoolTaskScheduler();

        threadPoolTaskScheduler.setPoolSize(5);
        threadPoolTaskScheduler.setThreadNamePrefix("my.main.package-Scheduler-");
        threadPoolTaskScheduler.initialize();

        scheduledTaskRegistrar.setTaskScheduler(threadPoolTaskScheduler);
    }
}

// A scheduled job that runs only when profile "prod" is enabled
@Component
@Profile("prod")
@NoArgsConstructor
class ExpirationNotificationScheduler {

    // Just for test, run each 10th second or each minute
    @Scheduled(cron = "10 * * * * *") // second, minute, hour, day of month, month, day(s) of week
    public void notifyExpiredAccounts() {
        System.out.println("Yes, I am a scheduled job.");
    }
}