我已经配置了spring SFTP以将文件从远程路径集中到本地,以处理一些作业,然后同时删除本地和远程文件。
下面的配置工作正常,除了删除本地文件外,我没有找到任何配置来删除本地文件,例如 delete-remote-files="true"
<bean id="sftpSessionFactory"
class="org.springframework.integration.sftp.session.DefaultSftpSessionFactory"
p:host="${sftp.host}"
p:port="${sftp.port}"
p:user="${sftp.username}"
p:password="${sftp.password}"
p:allowUnknownKeys="${sftp.allowUnknownKeys}" />
<int:channel id="sftpChannel">
<int:queue />
</int:channel>
<int-sftp:inbound-channel-adapter
id="sftpInboundAdapter"
channel="sftpChannel"
session-factory="sftpSessionFactory"
remote-directory="${sftp.remotedir}"
local-directory="${sftp.localdir}"
auto-create-local-directory="true"
delete-remote-files="true"
filename-pattern="*.TXT">
</int-sftp:inbound-channel-adapter>
<int:poller default="true" fixed-rate="${quartz.pick.repeatInterval}" max-messages-per-poll="${sftp.msg.per.poll}">
<int:transactional synchronization-factory="syncFactory" />
</int:poller>
<int:transaction-synchronization-factory id="syncFactory">
<int:after-rollback expression="@acceptOnceFilter.remove(payload)"/>
</int:transaction-synchronization-factory>
<bean id="acceptOnceFilter" class="org.springframework.integration.file.filters.AcceptOnceFileListFilter"/>
<int:service-activator input-channel="sftpChannel" ref="msgHandler" method="handleMessage"/>
<bean id="transactionManager" class="org.springframework.integration.transaction.PseudoTransactionManager"/>
<bean id="fileNameGenerator" class="org.springframework.integration.file.DefaultFileNameGenerator" />
这里,当文件从远程传输到本地时,服务激活器被调用。
服务激活器完成作业后,如何配置删除本地文件?
编辑:通过以下更改解决了从远程和本地删除有效负载的问题:
<int:transaction-synchronization-factory id="syncFactory">
<int:after-commit expression="payload.delete()" channel="nullChannel"/>
<int:after-rollback expression="@acceptOnceFilter.remove(payload)"/>
</int:transaction-synchronization-factory>
消息发送到流之后,入站适配器永远不会采取任何操作(自行执行)。它不了解有关下游流拓扑的任何信息-异步切换等。在删除文件之后和发送消息之前完成远程删除。
由于您已经在使用伪事务,并且在轮询程序线程上进行了所有操作,因此可以使用进行删除after-commit-expression
。
另一种技术是将a添加request-handler-advice
到最终使用者(在您的情况下为服务激活器)。这证明在该retry-and- more
示例应用程序。
编辑:
回应您在下面的评论;否,使用SpEL不可能做两件事-但是,您可以使用
<int:after-commit expression="payload" channel="postProcess"/>
并在postProcess
通道下游进行所需的操作。
但是,对于我来说,尚不清楚为什么要从过滤器中删除文件以获取成功和失败的信息-您应该只使用一个AcceptAllFileListFilter
。
顺便说一句,我看不到您acceptOnceFilter
在这里的任何地方使用过-您是否打算将其配置为local-filter
属性?
我有一个集成案例,从FTP获取xml有效负载,然后使用http出站通道将有效负载发送到webservice,FTP入站通道适配器有一个名为local-directory的强制属性,远程FTP文件将在这里下载,但是当我重新启动时,似乎本地目录中的所有文件都将被重新处理,请问如何避免这种情况?一种可能的方法是删除ftp入站通道适配器中的本地文件,如何做到这一点,你能建议吗? 谢谢
我在实现某些功能时遇到了一些问题,当我删除文件时,我注意到了一些不一致。 1)当我删除多个文件时,有时并不是所有文件都被转移到正确的目录。
这就是我的配置 这个想法是每3秒轮询一个目录,并根据通道向调度程序发送3条消息,以允许异步执行。然后根据消息数量聚合消息,然后发送到下一个服务激活器。第一个服务激活器将文件放在源目录中,第二个服务激活器获取聚合列表以将这些文件移动到暂存目录。 似乎发生的情况是,源文件夹跳过了一些文件,但临时文件夹确实获取了所有文件。我的猜测是,轮询器将消息发送到dispatcher通道,但当其线程池变满时,它会忽
问题内容: Spring Integration FTP中的入站通道适配器和出站通道适配器之间有什么区别?我应该使用哪一个?何时使用? 我从文档中了解到,出站可以发送任何类型的文件(例如byte [],String,java.io.File),但入站仅限于文件类型。那仅仅是区别还是其他? 问题答案: 我建议您首先阅读理论 。 任何Inbound适配器都旨在从外部系统获取数据。Outbound-放置
如果我创建一个SFTP入站通道适配器,并使用在SFTP中配置为channel属性的通道发送一些文件。文件将传输到SFTP远程目录本地目录,还是直接从通道流到本地目录