我想知道是否有人可以提供帮助,我知道我这样做是错的,我正在撕裂我的头发。我的目标是在Spring Batch作业中使用Spring Integrations SFTP删除远程目录中具有.txt扩展名的任何文件。我的理解是,我不需要远程文件来删除它们,并且可以在* .txt上为给定目录发出rm命令但是我可能不正确?
我有以下SFTP配置
<bean id="sftpSessionFactory"
class="org.springframework.integration.sftp.session.DefaultSftpSessionFactory">
<property name="host" value="${host}" />
<property name="port" value="${port}" />
<property name="user" value="${user}" />
<property name="privateKey" value="file:${privateKey}" />
<property name="password" value="${password}" />
</bean>
<int:channel id="rmChannel"/>
<int-sftp:outbound-gateway
session-factory="sftpSessionFactory"
request-channel="rmChannel"
remote-file-separator="/"
command="rm"
expression="headers['file_remoteDirectory'] + headers['file_remoteFile']" />
<bean id="cleanRemoteDirectoryTasklet" class="com.example.batch.job.integration.SFTPRmTasklet" scope="step">
<property name="channel" ref="rmChannel" />
<property name="filePatternToDelete" value="*.txt" />
<property name="targetDirectory" value="${remoteDirectory}"/> // edit removed 'file:' notation
</bean>
我相信我没关系到这一点我的问题是在SFTPRmTasklet中的Java实现中执行此流程,我不知道如何构造消息以启动sftp remove。目前我有这样的事情只是为了开始我知道我的有效载荷是错误的。
Message<String> rmRequest = MessageBuilder.withPayload("/my/target/dir")
.setHeader("file_remoteDirectory", targetDirectory)
.setHeader("file_remoteFile", filePatternToDelete)
.build();
channel.send(rmRequest)
最终会产生异常
org.springframework.integration.MessagingException: org.springframework.core.NestedIOException: Failed to remove file: 2: No such file
更新1
所以我决定只定位一个远程文件,并将filePatternToDelete更改为test.txt。经过一些调试后,我意识到AbstractRemoteFileOutBoundGateway
正在评估我的remoteFilePath到/my/target/dirtest.txt和远程文件名到dirtest.txt,这显然不是我想要的所以我添加了一个尾随到/到我的属性文件中的目标目录,这很好地解决了这个错误!
我现在可以按照我的意愿从远程服务器删除该文件,但是我收到了一个没有回复频道的错误,所以我添加了以下频道
<int:channel id="end"/>
并修改了我的出站网关
<int-sftp:outbound-gateway
session-factory="sftpSessionFactory"
request-channel="rmChannel"
reply-channel="end"
remote-file-separator="/"
command="rm"
expression="headers['file_remoteDirectory'] + headers['file_remoteFile']" />
现在这个频道没有订阅者的错误。至少进步,如果你没有猜到我对Spring很新!
答案 0 :(得分:2)
如果您对rm
的结果不感兴趣,请将reply-channel
设为nullChannel
。
就像unix上的/dev/null
一样。