如何在Spring 3中配置自定义触发器?

时间:2011-10-11 00:53:40

标签: java spring scheduling

我需要配置一个超出Spring内置调度功能的调度算法(基本上是“每5分钟一次,但只在4:00h到16:00h之间”)。似乎实现org.springframework.scheduling.Trigger接口是可行的方法,这看起来很简单。

我无法弄清楚的部分,the documentation似乎没有回答的部分是:这与XML配置如何混合?似乎没有任何方法在任务命名空间的元素中指定自定义触发器bean(除了Quartz示例)。

如何在Spring 3应用程序中使用自定义触发器?理想情况下使用Bean XML配置。

2 个答案:

答案 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