Spring Integration:处理后在远程SFTP位置移动文件

时间:2014-12-03 12:03:47

标签: java spring spring-integration

我有一个条件,我应该通过以下步骤从SFTP远程位置读取文件:

  1. 从SFTP位置读取文件说input文件夹。

  2. 处理文件并使用文件内容调用REST API。

  3. 如果呼叫成功,请将远程SFTP文件移至archive folder else将远程SFTP文件移动到error文件夹。

  4. 我正在考虑两种方法。我不知道哪些是可能的。

    首先,将文件从SFTP远程位置读取到本地,然后从远程删除它。然后调用REST API。根据REST调用的响应,成功或错误将文件上传到远程文件夹。

    其次,从SFTP远程位置读取文件到本地。然后调用REST API。根据REST调用的响应,成功或错误将文件上传到远程文件夹。

    任何人都可以告诉我哪种方法可行且方便?如果你能提到通道适配器,我将不胜感激。

    到目前为止,我可以调用REST API。

    <int-sftp:inbound-channel-adapter id="sftpInbondAdapter"
            auto-startup="true" 
            channel="receiveChannel" 
            session-factory="sftpSessionFactory"
            local-directory="${local.dir}" 
            remote-directory="${sftp.dir.input}"
            auto-create-local-directory="true" 
            delete-remote-files="true"
            filename-pattern="*.txt">
            <int:poller fixed-rate="60000" max-messages-per-poll="1" />
        </int-sftp:inbound-channel-adapter>
        <int:channel id="receiveChannel"/>
    
        <int:splitter input-channel="receiveChannel" output-channel="singleFile"/>
        <int:channel id="singleFile"/>
    
        <int:service-activator input-channel="singleFile"
            ref="sftpFileListenerImpl" method="processMessage" output-channel="costUpdate" />
        <int:channel id="costUpdate" /> 
    
         <int:header-enricher input-channel="costUpdate" output-channel="headerEnriched">
             <int:header name="content-type" value="application/json" />
         </int:header-enricher>
         <int:channel id="headerEnriched" />
    
         <int-http:outbound-gateway
            url="${cost.center.add.rest.api}" request-channel="headerEnriched"
            http-method="POST" expected-response-type="java.lang.String" reply-channel="costAdded" >
        </int-http:outbound-gateway>
        <int:publish-subscribe-channel id="costAdded" />
    

    在评估API调用响应后,一旦API调用成功,我想将远程文件移动到远程文件夹中的另一个位置。我的问题是如何根据http:outbound-gateway

    的响应将远程文件移动到另一个远程位置

1 个答案:

答案 0 :(得分:1)

请参阅retry-and-more sample,特别是Expression Evaluating Advice Demo - 它会显示如何根据上传的成功/失败采取不同的操作。

修改

回应您对Artem的回答的评论;由于您有delete-remote-files="true",因此无法移动远程文件;您必须先将其设置为false

然后,使用我建议的建议来处理成功或失败 - 使用远程文件ftp:outbound-gatewaymv。请参阅gateway documentation for the mv command