如何在Spring config.xml中配置Cron时区?

时间:2017-11-24 11:00:57

标签: java spring spring-boot configuration cron

我有一个带有Cron任务的Spring配置xml文件。任务在我的机器上定期执行。 如何在xml文件中配置此任务以使用莫斯科时区(与我的不同)?

<task:scheduler id="scheduler" pool-size="1"/>

<task:scheduled-tasks scheduler="scheduler">
    <task:scheduled ref="productTask" method="loadProduct" cron="0 0 10 * * *"/>
</task:scheduled-tasks>

编辑:我仔细检查了语法并稍微更改了代码。但它仍然不适合我。 下面我提供了我想出的最后一个配置。在这里,我收到以下异常:Constructor threw exception; nested exception is java.lang.IllegalArgumentException: Cron expression must consist of 6 fields (found 1 in "moscowTimeCronSchedule")

所以任务&#34;调度程序&#34;需要cron表达式而不是cron="moscowTimeCronSchedule"。我需要弄清楚如何将bean引用传递给它而不是纯cron表达式。

<task:scheduler id="scheduler" pool-size="1"/>

    <bean id="moscowTimeZone" class="java.util.TimeZone" factory-method="getTimeZone">
        <constructor-arg type="java.lang.String" value="Europe/Moscow"/>
    </bean>

    <bean id="moscowTimeCronSchedule" class="org.springframework.scheduling.support.CronTrigger"
          c:expression="*/15 * * * * *"
          c:timeZone-ref="moscowTimeZone"/>

    <task:scheduled-tasks scheduler="scheduler">
        <task:scheduled ref="productTask" method="loadProduct" cron="moscowTimeCronSchedule"/>
    </task:scheduled-tasks>

我发现此链接很有用,但它没有回答这个问题:如何传递bean而不是cron表达式。 http://websystique.com/spring/spring-job-scheduling-using-xml-configuration/

1 个答案:

答案 0 :(得分:1)

当Spring配置CronTask时,它使用一个接受String的简单构造函数形式。你需要的是它使用第二个构造函数,它接受CronTrigger。这应该有效(尽管如此,我还没有测试过它):

<bean
  id="moscowTimeZone"
  class="java.util.TimeZone"
  factory-method="getTimeZone">
    <constructor-arg type="java.lang.String" value="Europe/Moscow"/>
</bean>

<bean
  id="moscowTimeCronSchedule"
  class="org.springframework.scheduling.support.CronTrigger">
    <constructor-arg type="java.lang.String" value="0 0 10 * * *"/>
    <constructor-arg type="java.util.TimeZone" ref="moscowTimeZone"/>
</bean>

<task:scheduled-tasks scheduler="scheduler">
    <task:scheduled ref="productTask" method="loadProduct" trigger="moscowTimeCronSchedule"/>
</task:scheduled-tasks>

我在这里做了什么:

  1. 构建了对莫斯科时区的引用,并将其保存为弹簧配置中的bean。

  2. 使用该时区和cron表达式构建一个Cron Trigger实例作为另一个bean

  3. 在计划任务构造函数中使用Cron触发器。

  4. 不可否认,这个解决方案有点啰嗦,但听起来应该可以胜任。