将通道适配器定义为:
<int:channel id="target">
<int:queue />
</int:channel>
<int-jdbc:inbound-channel-adapter id="adapter" channel="target" query="${int.poll.query}" update="${int.update.query}" data-source="mock-datasource">
<int:poller fixed-rate="5000"/>
</int-jdbc:inbound-channel-adapter>
我想知道为什么我不能在运行时修改轮询率,如下所示:
SourcePollingChannelAdapter adapter = applicationContext.getBean("adapter",SourcePollingChannelAdapter.class);
adapter.setTrigger(new PeriodicTrigger(1000));
当我调试此解决方案时,我可以看到适配器附加了这个新的触发器,但轮询速率保持不变(每5秒)。我也尝试停止()并启动()适配器,运气相似。
任何人都可以指出我做错了什么? 感谢
答案 0 :(得分:4)
[<强>分辨强>
Spring团队的成员已经确认,无法在运行时修改触发器。因此,如果要动态修改轮询速率,例如限制入站消息,则必须滚动自己的触发器实现并为间隔轮询添加setter。
我在这里留下我的配置中所做的更改:
<int-jdbc:inbound-channel-adapter id="bancsAdapter" channel="target" query="${int.bancs.poll.query}" update="${int.bancs.update.query}" data-source="bancsMockDB">
<int:poller trigger="dynamicTrigger" />
</int-jdbc:inbound-channel-adapter>
<bean id="dynamicTrigger" class="directlabs.integration.DynamicTrigger">
<constructor-arg value="5000" />
</bean>
因此,对于限制,您只需要执行以下操作:
applicationContext.getBean("dynamicTrigger",DynamicTrigger.class).setPeriod(1000);
可以找到DynamicTrigger的实现here
可以找到Spring团队成员的原始评论here。
答案 1 :(得分:0)
虽然这里的空间不允许使用完整的示例,但我们创建了一个使用Quartz Scheduler作为触发机制的服务。它接受一个定义了Quartz Jobs和Triggers的XML文档(这个堆栈溢出描述了进程Use simple xml to drive the Quartz Sheduler)
输入通道将接受用于在Quartz中设置Schedules的XML。然后,输入通道可用于接受作业和触发器的动态更新。
作业映射数据中的xml条目将定义“输出”通道,并且可以添加可在输出消息标题中设置的其他作业映射数据以允许路由。
我们在许多Spring Integration上下文中不断重用此服务。
希望这有帮助。