2

将通道适配器定义为:

<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 秒)。我也尝试过 stop() 和 start() 适配器,运气类似。

任何人都可以指出我做错了什么?谢谢

4

2 回答 2

5

[已解决]

Spring团队的成员已经确认,触发器不能在运行时修改。因此,如果您想动态修改轮询速率,例如限制入站消息,您将不得不滚动您自己的 Trigger 实现并为间隔轮询添加一个设置器。

我将配置中所做的更改留在这里:

<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 的实现可以在这里找到

Spring 团队成员的原始评论可以在这里找到。

于 2012-02-02T00:19:55.920 回答
0

虽然这里的空间不允许完整的示例,但我们创建了一个使用 Quartz 调度器作为触发机制的服务。它接受定义了 Quartz Jobs 和 Triggers 的 XML 文档(此堆栈溢出描述了使用简单 xml 驱动 Quartz Sheduler的过程)

输入通道将接受 XML 用于在 Quartz 中设置调度。然后输入通道可用于接受作业和触发器的动态更新。

job-map-data 中的 xml 条目将定义一个“输出”通道,并且可以添加其他可以在输出消息头中设置的 job-map-data 以允许路由。

我们在许多 Spring Integration 上下文中不断地重用此服务。

希望这可以帮助。

于 2015-07-11T02:48:30.870 回答