【问题标题】:Spring Integration to Iterate through a list of files or records用于迭代文件或记录列表的 Spring 集成
【发布时间】:2013-07-31 09:55:55
【问题描述】:

我正在使用 spring 集成来下载文件并进行处理。

<int-sftp:inbound-channel-adapter channel="FileDownloadChannel"
                      session-factory="SftpSessionFactory"
                      remote-directory="/home/sshaji/from_disney/files"
                      filter = "modifiedFileListFilter"
                      local-directory="/home/sshaji/to_disney/downloads" 
                      auto-create-local-directory="true" >                       
       <integration:poller cron="*/10 * * * * *" default="true"/>   
</int-sftp:inbound-channel-adapter>

 <integration:transformer  input-channel="FileDownloadChannel"
                            ref="ErrorTransformer"
                            output-channel="EndChannel"/>

   <integration:router input-channel="FileErrorProcessingChannel"
                        expression="payload.getErrorCode() > 0">   
        <integration:mapping value="true" channel="ReportErrorChannel"/>
        <integration:mapping value="false" channel="FilesBackupChannel"/>
   </integration:router>

int-sftp:inbound-channel-adapter 用于从 sftp 服务器下载文件。 它下载大约 6 个文件。所有 xml 文件。

transformer 会遍历所有 6 个文件并检查它们是否有错误标签。 如果有错误标记,则将其错误代码设置为 1。否则将设置为 0。

当它从变压器中出来并进入路由器时, 我想发送错误代码设置为 1 的文件以移动到特定文件夹(错误) 以及将错误代码设置为 0 的那些移动到另一个文件夹 (NoError)。

目前,转换器返回一个“列表文件名”,其中包含所有 6 个文件的错误代码和文件名。

如何使用路由器检查每个文件的错误代码?然后将该特定文件映射到路由器。

解决我的问题的通用 C 逻辑

for (int i =0; i<fileNames.lenght();i++) {
     if(fileNames[i].getErrorCode == 1) {
     moveToErrorFolder(fileNames[i].getName());
     } else {
     moveToNoErrors(fileNames[i].getName());
     }
}

如何使用 spring 集成来实现这一点? 如果不可能,是否有任何解决方法? 我希望现在它清楚了。很抱歉上次没有提供足够的细节。

此外,在 int-sftp:inbound-channel-adapter 中,我已将“远程目录”和“本地目录”字段硬编码到系统中的特定文件夹中。我可以从 bean 属性或常量值中引用这些吗? 我需要根据config.xml文件配置这些值,可以吗?

我是 Spring 集成的新手。请帮我。 提前致谢。

【问题讨论】:

  • 对不起,我听不懂你在问什么。请提供更多详细信息,以及路由器前的 SI 配置。
  • 感谢@GaryRussell 的回复,我已经更新了帖子的更多细节。请看一看。如果您需要更多详细信息,请询问我。感谢您的帮助。

标签: spring-integration


【解决方案1】:

我仍然不清楚“转换器迭代所有 6 个文件”是什么意思。

每个文件都将在一条消息中传递给转换器,所以我看不出它如何发出 6 个列表。

听起来您需要一个带有correlation-strategy-expression="'foo'"release-strategy-expression="size() == 6"&lt;aggregator/>。这会将每个 File 聚合到 File 列表中,并将其传递给您的转换器。然后它将其转换为包含文件名和错误代码的状态对象列表。

最后,您将添加一个&lt;splitter/&gt;,它将列表拆分为单独的 FileName 消息以发送到路由器。

您可以为目录属性${some.property} 或SpEL 使用普通的Spring 属性占位符来使用另一个bean 的属性#{someBean.remoteDir}

【讨论】:

  • 好的,我怎样才能将分离器和路由器结合起来。拆分器输出将是大小为 6 的状态对象列表。路由器将如何处理每个单独的文件并将它们映射到单独的通道。我只看到路由器将整个有效负载映射到两个不同的通道。我还没有看到基于有效负载中各个内容的路由器映射。我是新来的。请举个例子。会有很大帮助的。
  • 您能否建议 int-sftp:inbound-channel-adapter 的解决方案,我已将“远程目录”和“本地目录”字段硬编码到系统中的特定文件夹.我可以从 bean 属性或常量值中引用这些吗?我需要根据config.xml文件配置这些值,可以吗?。
  • 你不能——这就是你需要一个分离器的原因。我还更新了答案以显示如何设置这些属性。请注意,它们只初始化一次。
  • 我希望这足以解决我的问题。会试试这个。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-05
  • 1970-01-01
  • 2015-02-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多