我有一个条件,我应该通过以下步骤从SFTP远程位置读取文件:
从SFTP位置读取文件说input
文件夹。
处理文件并使用文件内容调用REST API。
如果呼叫成功,请将远程SFTP文件移至archive
folder else将远程SFTP文件移动到error
文件夹。
我正在考虑两种方法。我不知道哪些是可能的。
首先,将文件从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
?
答案 0 :(得分:1)
请参阅retry-and-more sample,特别是Expression Evaluating Advice Demo - 它会显示如何根据上传的成功/失败采取不同的操作。
修改强>
回应您对Artem的回答的评论;由于您有delete-remote-files="true"
,因此无法移动远程文件;您必须先将其设置为false
。
然后,使用我建议的建议来处理成功或失败 - 使用远程文件ftp:outbound-gateway
和mv
。请参阅gateway documentation for the mv command。