如何通过属性文件禁用@Scheduled方法?

2022-09-04 20:07:49

我有一个定期运行的Spring计划方法:

@Scheduled(cron = "${spring.cron.expression}")
public void demonJob() { ... }

从 中成功读取 cron 表达式:application.properties

spring.cron.expression=0 0 * * * *

现在,我想将我的应用程序部署到一个特殊的环境中,在这个环境中不应该运行这个特定的计划方法。如果我像这样将cron属性留空...

spring.cron.expression=

...我得到以下异常:

Encountered invalid @Scheduled method 'demonJob': Cron expression must consist of 6 fields (found 0 in "")

如何优雅地禁用 Scheduled 方法,理想情况下,只能通过在 中提供不同的设置来禁用?application.properties


答案 1

从 Spring 5.1.0 开始,特殊的 cron 值 “-” 可以与 @Scheduled 注释一起使用,以禁用 cron 触发器。

特殊值“-”表示禁用的 cron 触发器,主要用于由 ${...} 占位符解析的外部指定值。

对于您的特定示例,您只需将变量设置为此值。如果这是一个 Spring Boot 项目,则可以使用可用于此目的的众多外部化配置选项之一,包括:spring.cron.expression

  • 命令行参数
  • Java 系统属性
  • 操作系统环境变量
  • 专门用于该环境的配置文件的特定于配置文件的应用程序属性

如果这不是一个 Spring Boot 项目,您仍然可以指定此属性,尽管这样做的机制将不那么标准,并且更特定于项目。


答案 2

空字符串是不正确的 cron 表达式。如果要在特定条件下禁用调度程序,只需使用注释,或者必须对 Spring Boot 中的属性使用注释进行操作。@Profile@ConditionalOnProperty

@Component
@ConditionalOnProperty(prefix = "spring.cron", name = "expression")
public class MyScheduler {
   @Scheduled(cron = "${spring.cron.expression}")
   public void demonJob() throws .. { .. }
}

推荐