我正在使用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引用,而是创建自己的触发器实现。
感谢您的帮助。
谢谢,
答案 0 :(得分:1)
根据您的用例和您的代码:
sourcePollingChannelAdapter.stop();
sourcePollingChannelAdapter.setTrigger(cronTrigger);
sourcePollingChannelAdapter.start();
这样做是非常正确的。这是因为CronTrigger
定制起来并不那么简单,因为它的所有属性都是final
。从另一方面来看,在任何CustomTrigger
实现中实现类似的东西都很容易。
CustomTrigger
的唯一好处是,每当您想要更改轮询期限时,您都不会创建新对象,并且因为stop/start
不会成为{{1}}的唯一好处{1}}您的端点用于更改该值。