2016-01-22 787 views
6

我有一个定期运行一个春天预定方法:如何通过属性文件禁用@Scheduled方法?

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

cron表达式被成功地从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

如果你想这样做,这个话题是关于“永远不会执行cron表达式”:http://stackoverflow.com/questions/13835221/quartz-cron-expression-that-will-never-execute – Berger

+0

@ Berger,但是这个问题涉及石英cron表达式,这些表达式似乎比spring cron表达式更灵活。 –

回答

5

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

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

ConditionalOnProperty看起来像一个很酷的解决方案 - 不幸的是这不是一个Spring Boot项目。配置文件解决方案将要求我们添加所有需要调度程序的配置文件,但我们宁愿仅针对一个特定配置文件禁用它。 –

+0

你可以很简单地自己实现@ConditionalOnProperty。这是5行的条件类 –

0

可能的解决你的问题

  1. 配置属性文件基于环境
  2. 根据您的环境配置文件配置您的ApplicationContext。
  3. 使用环境特定的CRON条目。
  4. 请检查这个link哪些可以帮到你。
0

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

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

+1

1月1日1:01:01不是你的例子吗?这看起来不像“从不”。或者您是否假设在该日期之前更改日程安排以避免执行?你能否详细解释一下? –

+0

你说得对。我只是想设置无法访问的调度程序。这个表达式适用于我的代码(是的,我认为它将每年运行一次)。但我想给出一个解决这个问题的方法(例如,你可以设定两年内的一个时刻) –

相关问题