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

Fri*_*rdt 12 java spring

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

@Scheduled(cron = "${spring.cron.expression}")
public void demonJob() throws .. { .. }
Run Code Online (Sandbox Code Playgroud)

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

spring.cron.expression=0 0 * * * *
Run Code Online (Sandbox Code Playgroud)

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

spring.cron.expression=
Run Code Online (Sandbox Code Playgroud)

..我得到以下异常:

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

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

Jak*_*ski 7

空字符串是一个不正确的cron表达式.如果要在特定条件下禁用调度程序,只需使用@Profile注释,或者如果必须使用@ConditionalOnPropertySpring Boot中的属性使用注释.

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


M. *_*tin 6

从 Spring 5.1.0 开始,一种选择是使用“-”作为 cron 表达式,因为@Scheduled注释接受它作为 cron 表达式以禁用 cron 触发器。

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

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

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

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