Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何通过属性文件禁用@Scheduled方法?_Java_Spring - Fatal编程技术网

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

Java 如何通过属性文件禁用@Scheduled方法?,java,spring,Java,Spring,我有一个定期运行的Spring计划方法: @Scheduled(cron = "${spring.cron.expression}") public void demonJob() throws .. { .. } 已成功从应用程序读取cron表达式。属性: spring.cron.expression=0 0 * * * * 现在,我想将我的应用程序部署到一个特殊的环境中,这个特定的调度方法不应该在这个环境中运行。如果我像这样将cron属性留空 spring.cron.expression

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

@Scheduled(cron = "${spring.cron.expression}")
public void demonJob() throws .. { .. }
已成功从
应用程序读取cron表达式。属性

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

spring.cron.expression=
…我得到以下例外情况:

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

如何优雅地禁用计划方法,理想情况下仅通过在
应用程序中提供不同的设置。属性

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

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

您问题的可能解决方案

  • 根据环境配置属性文件
  • 根据您的环境配置文件配置ApplicationContext
  • 使用特定于环境的CRON条目
  • 请检查这个,这可能对你有帮助

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


    这种方法的好处是您不必对代码做任何额外的更改。

    从Spring 5.1.0开始,一个选项是使用“-”作为cron表达式,因为注释将其作为cron表达式接受以禁用cron触发器

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

    对于您的特定示例,您只需要将其指定为
    spring.cron.expression
    变量。如果您使用的是Spring Boot,那么您可以使用其中一种,包括:

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

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

    如果您想这样做,本主题是关于“从不执行cron表达式”:@Berger但这个问题涉及石英cron表达式,它似乎比spring cron表达式更灵活。ConditionalOnProperty似乎是一个很酷的解决方案-不幸的是,这不是spring启动项目。配置文件解决方案要求我们添加所有需要调度程序的配置文件,但我们更愿意只对一个特定的配置文件禁用它。您可以非常简单地自己实现@ConditionalOnProperty。这是一个有5行的条件类,你的示例不是要在1月1日1:01:01执行吗?这看起来不像是“永远不会”。或者你认为在该日期之前更改计划以避免执行?你能详细解释一下吗?你说得对。我只是想设置不可访问的调度程序。这个表达式适用于我的代码(是的,我想它将每年运行一次)。但我想给出一种解决这个问题的方法(你可以在两年内设定一个时间点),比如OOF。这里有个大省。。。他会多次投票。谢谢