我需要配置一个超出Spring内置调度功能的调度算法(基本上是“每5分钟一次,但只在4:00h到16:00h之间”)。似乎实现org.springframework.scheduling.Trigger接口是可行的方法,这看起来很简单。
我无法弄清楚的部分,the documentation似乎没有回答的部分是:这与XML配置如何混合?似乎没有任何方法在任务命名空间的元素中指定自定义触发器bean(除了Quartz示例)。
如何在Spring 3应用程序中使用自定义触发器?理想情况下使用Bean XML配置。
答案 0 :(得分:6)
看看我一年前写过的DurationTrigger。
public class DurationTrigger implements Trigger {
/**
* <p> Create a trigger with the given period, start and end time that define a time window that a task will be
* scheduled within.</p>
*/
public DurationTrigger( Date startTime, Date endTime, long period ) {...}
// ...
}
以下是使用此触发器安排此类任务的方法:
Trigger trigger = new DurationTrigger( startTime, endTime, period );
ScheduledFuture task = taskScheduler.schedule( packageDeliveryTask, trigger );
或者,您可以使用CronTrigger / cron表达式:
<!-- Fire every minute starting at 2:00 PM and ending at 2:05 PM, every day -->
<task:scheduled-tasks>
<task:scheduled ref="simpleProcessor" method="process" cron="0 0-5 14 * * ?"/>
</task:scheduled-tasks>
查看此JIRA以及此Spring Integration article
修改强>:
在JIRA讨论中,您可以使用Spring Integration配置上面的DurationTrigger
或任何其他自定义触发器:
<inbound-channel-adapter id="yourChannelAdapter"
channel="yourChannel">
<poller trigger="durationTrigger"/>
</inbound-channel-adapter>
<beans:bean id="durationTrigger" class="org.gitpod.scheduler.trigger.DurationTrigger">
<beans:constructor-arg value="${start.time}"/>
<beans:constructor-arg value="${end.time}"/>
<beans:constructor-arg value="${period}"/>
</beans:bean>
在项目中使用Spring Integration非常简单,即使您不打算这样做。您可以使用上述调度部分,或者依赖Spring Integration可用的许多其他Enterprise Integration模式。
答案 1 :(得分:0)
似乎使用XML来配置任何,但是在Spring 3.0中不可能使用两个标准触发器。它已被添加为3.1M2版本中的新功能,但是:https://jira.springsource.org/browse/SPR-8205
感谢Mark Fisher pointing this out。