【问题标题】:FileInboundAdapter - Setting a new Trigger during run timeFileInboundAdapter - 在运行时设置新触发器
【发布时间】:2014-09-29 16:53:41
【问题描述】:

我正在使用 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 开发人员建议不要在运行时更改触发器引用,而是创建自己的触发器实现。

  1. 谁能解释一下为什么我们不应该在运行时更改触发器引用?
  2. 上述方法是否存在缺陷
  3. 我想让新的 Cron 立即生效。即取消当前计划任务并使用新的 Cron 表达式计划一个新任务。是否可以使用自定义触发器方法?

感谢您的帮助。

谢谢,

【问题讨论】:

    标签: java spring-integration


    【解决方案1】:

    根据您的用例和代码:

    sourcePollingChannelAdapter.stop();
    sourcePollingChannelAdapter.setTrigger(cronTrigger);
    sourcePollingChannelAdapter.start();
    

    这样做确实是正确的。那是因为CronTrigger 的自定义并不那么简单,因为它的所有属性都是final。而另一方面,在任何CustomTrigger 实现中实现类似的东西并不容易。

    CustomTrigger 的唯一好处是,当您想更改轮询周期时,您不必每次都创建新对象,并且因为没有理由 stop/start 您的端点进行更改那个值。

    【讨论】:

    • 您的技术是立即改变轮询行为的唯一方法。使用 dynamic trigger,正如论坛文章中所讨论的,由于 Spring Triggers 的工作方式,仅在下一次投票后才会生效。
    • 感谢 Artem 和 Gary。我还有一个问题。如果我在轮询文件到达时停止适配器,是否会有任何潜在的消息丢失?即如果轮询器在处理文件消息时停止(因为我停止了适配器)会发生什么。
    • 代码看起来像this.runningTask.cancel(true);,所以在某些情况下你的任务会被拒绝。为避免这种情况,您可以将task-executor 添加到&lt;poller&gt; 或使channel 不是direct
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-13
    • 2021-02-17
    • 2011-01-23
    • 1970-01-01
    • 1970-01-01
    • 2021-10-19
    • 1970-01-01
    相关资源
    最近更新 更多