Java Spring SFTP入站chanel适配器删除本地文件
我已经将SpringSFTP配置为将文件从远程路径汇集到本地路径,处理一些作业,然后同时删除本地和远程文件 下面的配置工作正常,除了本地文件删除,我没有找到任何删除本地文件的配置,比如Java Spring SFTP入站chanel适配器删除本地文件,java,spring,spring-integration,spring-integration-sftp,Java,Spring,Spring Integration,Spring Integration Sftp,我已经将SpringSFTP配置为将文件从远程路径汇集到本地路径,处理一些作业,然后同时删除本地和远程文件 下面的配置工作正常,除了本地文件删除,我没有找到任何删除本地文件的配置,比如delete remote files=“true” 这里,当文件从远程传输到本地时,会调用服务激活器 如何配置在service activator完成作业时删除本地文件 编辑:通过以下更改解决远程和本地的有效负载删除问题: <int:transaction-synchronization-factory
delete remote files=“true”
这里,当文件从远程传输到本地时,会调用服务激活器
如何配置在service activator完成作业时删除本地文件
编辑:通过以下更改解决远程和本地的有效负载删除问题:
<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>
入站适配器在消息发送到流后从不(自行)采取任何操作;它不知道任何关于下游流拓扑的信息——异步切换等。远程删除是在获取文件之后和发送消息之前完成的 由于您已经在使用伪事务,并且在轮询器线程上执行所有操作,因此可以使用提交后的
表达式执行删除操作
另一种技术是将请求处理程序通知添加到最终消费者(在您的案例中为service activator)。这在本文中得到了证明
编辑:
回应您的以下评论;不,不可能用SpEL做两件事-但是,您可以使用
<int:after-commit expression="payload" channel="postProcess"/>
并在后处理
通道的下游流上执行任何操作
但是,我不清楚您为什么要从筛选器中删除文件,无论是成功还是失败-您应该使用AcceptAllFileListFilter
顺便说一句,我看不到您的acceptOnceFilter
在这里的任何地方被使用-您是否打算将其配置为local filter
属性?入站适配器在消息发送到流后从不采取任何行动(自行);它不知道任何关于下游流拓扑的信息——异步切换等。远程删除是在获取文件之后和发送消息之前完成的
由于您已经在使用伪事务,并且在轮询器线程上执行所有操作,因此可以使用提交后的表达式执行删除操作
另一种技术是将请求处理程序通知添加到最终消费者(在您的案例中为service activator)。这在本文中得到了证明
编辑:
回应您的以下评论;不,不可能用SpEL做两件事-但是,您可以使用
<int:after-commit expression="payload" channel="postProcess"/>
并在后处理
通道的下游流上执行任何操作
但是,我不清楚您为什么要从筛选器中删除文件,无论是成功还是失败-您应该使用AcceptAllFileListFilter
顺便说一下,我看不到您的acceptOnceFilter
在这里的任何地方被使用-您是否打算将其配置为local filter
属性?谢谢Gary,让我试试您的解决方案,有没有办法通过表达式执行两个任务,例如:1)删除有效负载,和2)从acceptOnceFilter中删除有效负载。它正在工作,(1)使用提交表达式后的解决文件删除问题,您能否提及从acceptOnceFilter中删除有效负载?在提交表达式后尝试使用=“payload.delete()和@acceptOnceFilter.remove(payload)”,其中只有delete可以正常工作。Russel当我在回滚后将表达式写为payload.renameTo(payload.name+'.error')
它在本地目录中重命名,文件在远程路径中删除时,我希望在远程目录中重命名。我做错了什么?没有;有效载荷是在我们向通道发送消息之前远程操作结束的本地文件;消息处理无法与远程服务器交互。您需要向SFTP发送消息(从回滚后的
)并使用mv
命令重命名远程文件。它在远程目录中被删除,因为您有delete remote files=“true”
。谢谢Gary,让我试试您的解决方案,有没有办法通过表达式执行两个任务,例如:1)删除有效负载,2)从acceptOnceFilter中删除有效负载。它正在工作,(1)在提交表达式之后使用解决文件删除问题,请您提及从acceptOnceFilter中删除有效负载的内容好吗?请在提交表达式=“payload.delete()和@acceptOnceFilter.remove(payload)”后尝试,其中只有delete可以正常工作。当我在回滚后以payload.renameTo(payload.name+“.error”的形式在中写入表达式时,Russel
它在本地目录中重命名,文件在远程路径中被删除,我希望在远程目录中重命名。我做错了什么?没有;有效载荷是在我们向通道发送消息之前远程操作结束的本地文件;消息处理无法与远程服务器交互。您需要向SFTP发送消息(从回滚后的
)并使用mv
命令重命名远程文件。它在远程目录中被删除,因为您有delete remote files=“true”
。