我有一个定期运行的Spring计划方法:
@Scheduled(cron = "${spring.cron.expression}")
public void demonJob() throws .. { .. }
从application.properties
:
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
中提供不同的设置?
答案 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中的一种,包括:
如果这不是Spring Boot项目,您仍然可以指定此属性,尽管这样做的机制将变得不那么标准,而更多地取决于项目。
答案 2 :(得分:0)
您问题的可能解决方案
答案 3 :(得分:0)
我可以提供另一种方法。只需重新定义applicatino cron表达式即可设置无法访问的时间段。例如。 spring.cron.expression=1 1 1 1 1 ?
(这是我在我的代码中使用的,对我来说已经足够了。)
这种方法的好处是您不必在代码中进行任何其他更改。