0

在处理了由一系列 FTP 出站网关ls命令产生的所有消息后,停止 Spring Integration 应用程序的最佳方法是什么?

作为一项一次性工作,我需要遍历 FTP 目录结构,对找到的每个目录进行递归,并复制每个文件,然后将其作为消息发送以进行处理。一旦 FTP 目录树被完全遍历,并且遍历产生的所有消息都已被处理,我想优雅地停止应用程序。

我目前的想法是,我可以尝试跟踪网关和所有队列的活动,当它们的大小都为 0 一段时间后,终止应用程序。这可以通过做一些事情来变得更加复杂,比如为每个目录保留所有文件的计数(这需要扩展AbstractRemoteFileOutboundGateway),确保目录名称保留在流中的所有消息头上,然后有一个下游组件保持为每个目录处理的消息计数,并在全部计算完后启动关闭。

这听起来像是相当多的工作——有人知道更简单的方法吗?我可以选择在没有 Spring Integration 的情况下编写应用程序和手动执行大量繁琐的工作(迭代 FTP 树、复制文件),或者使用 Spring Integration 但必须扩展它的一部分以匹配我的用例.

4

1 回答 1

1

有点绕,但这是我能想到的一种方法:

.1。由于您必须放置消息来触发 ftp 出站网关,因此在您触发所有消息后,放置一条带有 STOP 的虚拟消息,例如作为有效负载。就在出站 ftp 网关之前放置一个路由器,该路由器将选择性地将消息发送到 ftp 网关或步骤后 FTP 网关 - 通过一次只接受一条消息的通道发送它,以便对消息进行序列化。

.2. 当您收到 STOP 消息时,一旦进入文件处理通道,请将此消息发送到特定队列通道,例如停止队列通道。

.3. 在您的主程序中获取对此停止队列通道的引用,一旦您启动 SI 流程,只需等待消息到达队列通道,一旦 STOP 消息到达此队列通道,您的主方法将继续并且流程应该停止在此刻。

于 2012-10-30T21:23:37.277 回答