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

时间:2016-01-22 09:42:10

标签: java spring

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

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

application.properties

成功读取了cron表达式
spring.cron.expression=0 0 * * * *

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

spring.cron.expression=

..我收到以下异常:

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

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

4 个答案:

答案 0 :(得分:7)

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

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

答案 1 :(得分:2)

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

  

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

对于您的特定示例,只需要将其指定为spring.cron.expression变量。如果您使用的是Spring Boot,则可以为此目的使用众多externalized configuration options available中的一种,包括:

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

如果这不是Spring Boot项目,您仍然可以指定此属性,尽管这样做的机制将变得不那么标准,而更多地取决于项目。

答案 2 :(得分:0)

您问题的可能解决方案

  1. 根据环境配置属性文件
  2. 根据您的环境配置文件配置ApplicationContext。
  3. 使用特定于环境的CRON条目。
  4. 请查看link这可能会对您有所帮助。

答案 3 :(得分:0)

我可以提供另一种方法。只需重新定义applicatino cron表达式即可设置无法访问的时间段。例如。 spring.cron.expression=1 1 1 1 1 ?(这是我在我的代码中使用的,对我来说已经足够了。)

这种方法的好处是您不必在代码中进行任何其他更改。

相关问题