0

我正在使用 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 文件。

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

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

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

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

我的问题的通用 C 逻辑

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

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

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

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

4

1 回答 1

0

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

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

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

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

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

于 2013-07-31T15:17:44.663 回答