gpt4 book ai didi

java - Spring SFTP入站 channel 适配器删除本地文件

转载 作者:行者123 更新时间:2023-12-02 03:46:33 24 4
gpt4 key购买 nike

我已经配置了 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 进行删除。

另一种技术是将request-handler-advice添加到最终消费者(在您的情况下是服务激活器)。 the retry-and-more sample app 中对此进行了演示。 .

编辑:

回应您的以下评论;不,不可能用 SpEL 做两件事 - 但是,您可以使用

<int:after-commit expression="payload" channel="postProcess"/>

并在 postProcess channel 的下游流程上执行您想要的任何操作。

但是,我不清楚为什么要从过滤器中删除成功和失败的文件 - 您应该只使用 AcceptAllFileListFilter 来代替。

顺便说一句,我没有看到您的 acceptOnceFilter 在这里任何地方使用 - 您是否打算将其配置到 local-filter 属性中?

关于java - Spring SFTP入站 channel 适配器删除本地文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36247467/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com