如何在Spring中根据配置文件激活@Scheduled任务?

16

我如何在特定的配置文件中启用定时作业?

伪代码:

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

}

那可能吗?


1
如果您不想要任何定时任务,只需为与特定配置文件相关联的@EnableScheduling注释创建一个单独的配置。如果未启用该配置,则会忽略@Scheduled注释。 - M. Deinum
谢谢,这是一个好主意,通过显式配置文件启用调度。但如果我不想在测试中运行任何作业,那么这仅有限的用处。大多数情况下,我只想排除特定的作业。 - membersound
如果您不想要这些作业,请在bean上注释@Profile,而非方法。 - M. Deinum
3个回答

21

每个配置文件中应该只有一个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() {

    }
}

7
您可以使用以下方法进行操作。 几乎与您已经完成的方式相同,但需要在冒号后添加默认值,该值应在未找到属性时选择。在此处,我们使用“ - ”作为禁用cron表达式:
@Scheduled(cron = "${job.cron:-}")
public void runJob() {

}

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

这是application-prod.properties文件的内容:

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

对于prod配置文件,它将每30秒启动一次,而对于所有其他配置文件,则关闭。


1
如果我使用CORN_DISABLE表达式“-”,应用程序会崩溃。我们需要进行其他配置吗? - kashi viswanath
使用SpringBoot,它可以直接运行,但使用Spring则可能需要额外的配置。可以查看PropertyPlaceholderConfigurer或者PropertySourcesPlaceholderConfigurer。自Spring 3以来,默认值语法本身就可用。 - alexkov
有时候,只需要通过配置文件更改 cron 表达式,使用两个 bean 反而太麻烦了。谢谢。 - Guilherme

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.");
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接