Java 如何通过属性文件禁用@Scheduled方法?
我有一个定期运行的Spring计划方法: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
@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。这里有个大省。。。他会多次投票。谢谢