当前位置: 首页 > 面试题库 >

Spring SFTP入站chanel适配器删除本地文件

锺星洲
2023-03-14
问题内容

我已经配置了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远程目录本地目录,还是直接从通道流到本地目录