我正在使用任务命名空间在spring中设置一个计划任务方案。
我想根据cron表达式安排大多数任务,有些只需要启动一次,启动后固定延迟,然后再不启动(即设置为repeatCount
到0
一个SimpleTriggerBean将实现)。
是否有可能在任务命名空间中实现这一点,或者我是否需要恢复为我的触发器定义bean?
答案 0 :(得分:15)
如果您不需要初始延迟,可以在启动时“运行一次”,如下所示:
<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进行测试) - 这不需要任何其他依赖项,您不必编写自己的触发器,但是必须配置Spring提供的PeriodicTrigger
:
<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>
Spring 3.2似乎直接支持“initial-delay”属性,但我没有对此进行测试;我猜这有效:
<task:scheduled-tasks>
<task:scheduled ref="myThing" method="doStuff"
fixed-rate="#{ T(java.lang.Long).MAX_VALUE }"
initial-delay="5000"/>
</task:scheduled-tasks>
答案 1 :(得分:13)
我的工作范例:
<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>
答案 2 :(得分:7)
如果查看Task namespace XSD,您会发现只有三种不同的配置类型:fixed-delay
,fixed-rate
和cron
。
如果你看一下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);
}
}
因此无法组合这些属性。简而言之:命名空间不会让你到那里。
答案 3 :(得分:3)
这比其他答案更有效。
// Will fire the trigger 1 + repeatCount number of times, start delay is in milliseconds
simple name: 'mySimpleTrigger', startDelay: 5000, repeatCount: 0