【发布时间】:2015-01-20 15:11:43
【问题描述】:
我需要制作一个小型 Spring Integration 应用程序,将一个表从 JDBC 源同步到另一个,我只需要偶尔启动该脚本。
我想从入站通道适配器进行一次轮询(等待消息流过链)并退出应用程序。
我找不到任何明显的方法来做到这一点:有什么建议吗?
【问题讨论】:
-
感谢史蒂夫指出正确的解决方案!
我需要制作一个小型 Spring Integration 应用程序,将一个表从 JDBC 源同步到另一个,我只需要偶尔启动该脚本。
我想从入站通道适配器进行一次轮询(等待消息流过链)并退出应用程序。
我找不到任何明显的方法来做到这一点:有什么建议吗?
【问题讨论】:
@Steve 建议正确的解决方案。
你应该让你的<poller> 和一些长的fixed-delay 不开始一个新的轮询任务。或者在轮询任务运行后停止<inbound-channel-adapter>。为此,只需将channel 设为<publish-subscribe-channel> 并添加一个订阅者,例如:
<outbound-channel-adapter channel="processChannel" expression="@adapter.stop()">
所以,这是第一部分:如何只制作单个poll?
回复。 System.exit()。
您应该在流程末尾添加类似 outbound-channel-adapter:
<outbound-channel-adapter channel="endProcessChannel" expression="T(System).exit()">
【讨论】:
int-jdbc:stored-proc-inbound-channel-adapter 和 int-file:outbound-channel-adapter。我将我的<int:channel> 配置更改为<int-publish-subscribe-channel>,但是在我的解决方案中我应该在哪里插入outbound-channel-adapters?我需要在 Java 代码中添加订阅者吗?有没有例子?抱歉,刚接触 Spring(集成)并且仍在尝试弄清楚一切是如何工作的......
<oubound-channel-adapter> 放在哪里都没有关系。唯一重要的是您应该为该适配器使用相同的<int-publish-subscribe-channel>。并且不要忘记使用order 选项使其成为第二个订阅者。有关这些组件和选项,请参阅 XSD 文档。
order 负责。并且您正确使用它。也许你有一些 async 交接?如果您启动一个新的 SO 线程并在那里共享调试日志以确认即使使用这样的配置,exit(0) 也会在文件写入之前发生。