如何仅在特定配置文件中启用预定作业?
伪代码:
@Scheduled(cron = "${job.cron}")
@Profile("prod")
public void runJob() {
}
这可能吗?
答案 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.");
}
}