SFTP Spring Integrations rm命令

时间:2015-07-07 11:43:08

标签: spring spring-batch spring-integration

我想知道是否有人可以提供帮助,我知道我这样做是错的,我正在撕裂我的头发。我的目标是在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很新!

1 个答案:

答案 0 :(得分:2)

如果您对rm的结果不感兴趣,请将reply-channel设为nullChannel

就像unix上的/dev/null一样。