使用Spring任务命名空间计划任务运行一次

问题描述:

我使用任务命名空间在春季设置了计划任务计划。我想按照cron表达式安排大多数任务,有些只需要触发一次,启动后有一个固定的延迟,然后再不会再一次(即在SimpleTriggerBean上设置repeatCount0会实现什么)。使用Spring任务命名空间计划任务运行一次

是否有可能在任务命名空间内实现此操作,还是需要恢复为触发器定义bean?

如果你看看Task namespace XSD,你会发现只有三种不同的配置类型:fixed-delay,fixed-ratecron

如果你看ScheduledTasksBeanDefinitionParser的来源,你会看到只有其中一个值被评估。这里是相关部分:

String cronAttribute = taskElement.getAttribute("cron"); 
if (StringUtils.hasText(cronAttribute)) { 
    cronTaskMap.put(runnableBeanRef, cronAttribute); 
} 
else { 
    String fixedDelayAttribute = taskElement.getAttribute("fixed-delay"); 
    if (StringUtils.hasText(fixedDelayAttribute)) { 
     fixedDelayTaskMap.put(runnableBeanRef, fixedDelayAttribute); 
    } 
    else { 
     String fixedRateAttribute = taskElement.getAttribute("fixed-rate"); 
     if (!StringUtils.hasText(fixedRateAttribute)) { 
      parserContext.getReaderContext().error(
        "One of 'cron', 'fixed-delay', or 'fixed-rate' is required", 
        taskElement); 
      // Continue with the possible next task element 
      continue; 
     } 
     fixedRateTaskMap.put(runnableBeanRef, fixedRateAttribute); 
    } 
} 

所以没有办法将这些属性结合起来。总之:命名空间不会让你在那里。

我的工作例如:

<bean id="whateverTriggerAtStartupTime" class="org.springframework.scheduling.quartz.SimpleTriggerBean"> 
    <property name="jobDetail" ref="whateverJob"/> 
    <property name="repeatCount" value="0"/> 
    <property name="repeatInterval" value="10"/> 
</bean> 

这工作,比其他答案比较容易的方式。

// Will fire the trigger 1 + repeatCount number of times, start delay is in milliseconds 
    simple name: 'mySimpleTrigger', startDelay: 5000, repeatCount: 0 
+1

这是什么语法? – 2015-04-24 03:43:40

如果不需要初始延迟,你可以把它在启动时运行“只有一次”如下:

<task:scheduled-tasks> 
    <!-- Long.MAX_VALUE ms = 3E8 years; will run on startup 
        and not run again for 3E8 years --> 
    <task:scheduled ref="myThing" method="doStuff" 
       fixed-rate="#{ T(java.lang.Long).MAX_VALUE }" /> 
</task:scheduled-tasks> 

(当然,如果你觉得你的代码将运行时间超过3E8 years,则可能需要采用不同的方法...)

如果您需要初始延迟,可以按如下方式对其进行配置(我正在使用Spring 3.1.1进行测试) - 这不要求任何额外的依赖关系,你不必编写自己的触发器,但你必须配置PeriodicTrigger提供由Spring:

<bean id="onstart" class="org.springframework.scheduling.support.PeriodicTrigger" > 
    <!-- Long.MAX_VALUE ms = 3E8 years; will run 5s after startup and 
       not run again for 3E8 years --> 
    <constructor-arg name="period" value="#{ T(java.lang.Long).MAX_VALUE }" /> 
    <property name="initialDelay" value="5000" /> 
</bean> 
<task:scheduled-tasks> 
    <task:scheduled ref="myThing" method="doStuff" trigger="onstart" /> 
</task:scheduled-tasks> 

春3.2似乎支持“初始延迟”直接属性,但是我没有测试此;我猜这是有效的:

<task:scheduled-tasks> 
    <task:scheduled ref="myThing" method="doStuff" 
         fixed-rate="#{ T(java.lang.Long).MAX_VALUE }" 
         initial-delay="5000"/> 
</task:scheduled-tasks>