Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring SFTP入站chanel适配器删除本地文件_Java_Spring_Spring Integration_Spring Integration Sftp - Fatal编程技术网

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

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

我已经将SpringSFTP配置为将文件从远程路径汇集到本地路径,处理一些作业,然后同时删除本地和远程文件

下面的配置工作正常,除了本地文件删除,我没有找到任何删除本地文件的配置,比如
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”