Files InboundAdapter - 在运行时设置新的触发器

时间:2014-09-29 16:53:41

标签: java spring-integration

我正在使用Spring集成3.0.0。我们需要在运行时动态更改轮询间隔。 我遵循了以下方法,设置了一个带有轮询器的入站适配器,该轮询器每5分钟轮询一次。我使用过Cron是因为我们希望拥有高级的调度功能(即我们只能将轮询器更改为仅在一天中的特定时间内轮询)

在运行期间,我获得了对适配器的引用,停止了适配器,使用新表达式创建了一个新的crontrigger,将新触发器设置为适配器并启动适配器。

<file:inbound-channel-adapter id="fileInboundAdapter"
    channel="filesIn" directory="C:\\TEMP\\input\\">
    <int:poller id="poller" cron="0 0/5 * * * *"
        error-channel="errorChannel" max-messages-per-poll="1" />
</file:inbound-channel-adapter>


    SourcePollingChannelAdapter sourcePollingChannelAdapter = (SourcePollingChannelAdapter) context
            .getBean("fileInboundAdapter");
            CronTrigger cronTrigger = new CronTrigger("0 0/10 * * * *");
    sourcePollingChannelAdapter.stop();
    sourcePollingChannelAdapter.setTrigger(cronTrigger);
    sourcePollingChannelAdapter.start();

这种方法运作良好。

但在论坛中,与同一问题(http://forum.spring.io/forum/spring-projects/integration/113138-problems-while-trying-to-modify-polling-rate-on-runtime)相关的主题之一,Spring开发人员建议不要在运行时更改Trigger引用,而是创建自己的触发器实现。

  1. 任何人都可以解释为什么我们不应该在运行时更改触发器参考?
  2. 上述方法是否有任何缺陷
  3. 我想让新的Cron立即生效。即取消当前的计划任务并使用新的Cron表达式安排新任务。是否可以使用自定义触发器方法?
  4. 感谢您的帮助。

    谢谢,

1 个答案:

答案 0 :(得分:1)

根据您的用例和您的代码:

sourcePollingChannelAdapter.stop();
sourcePollingChannelAdapter.setTrigger(cronTrigger);
sourcePollingChannelAdapter.start();
这样做是非常正确的。这是因为CronTrigger定制起来并不那么简单,因为它的所有属性都是final。从另一方面来看,在任何CustomTrigger实现中实现类似的东西都很容易。

CustomTrigger的唯一好处是,每当您想要更改轮询期限时,您都不会创建新对象,并且因为stop/start不会成为{{1}}的唯一好处{1}}您的端点用于更改该值。