user523098
user523098

Reputation:

SFTP Spring Integrations rm command

I am wondering if someone can assist, I know I am doing this wrong and I'm tearing my hair out. My goal is to delete any files with a .txt extension in a remote directory using Spring Integrations SFTP in a Spring Batch job. It is my understanding that I do not have to ls remote files to remove them and can just issue an rm command on *.txt for a given directory however I may be incorrect?

I have the following SFTP configuration

<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>

I believe I am OK to this point an my problem is executing this flow in the Java implementation in SFTPRmTasklet, I'm not sure how to construct the message to initiate the sftp remove. Currently I have something like this simply to kick it off I know that my payload is wrong.

Message<String> rmRequest = MessageBuilder.withPayload("/my/target/dir")
                .setHeader("file_remoteDirectory", targetDirectory)
                .setHeader("file_remoteFile", filePatternToDelete)
                .build();

channel.send(rmRequest)

ultimately this yields an exception

org.springframework.integration.MessagingException: org.springframework.core.NestedIOException: Failed to remove file: 2: No such file

UPDATE 1

So I decided to target just one remote file and changed filePatternToDelete to test.txt. After a bit of debugging I realised that AbstractRemoteFileOutBoundGateway was evaluating my remoteFilePath to /my/target/dirtest.txt and remote filename to dirtest.txt, which is obviously not what I wanted so I added a trailing to / to the target directory in my properties file and this sorted out this error great!

I can now delete the file from the remote server as I wished to do however I received an error around no reply-channel so I have added the following channel

<int:channel id="end"/>

and modified my outbound gateway

<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']" />

and now get an error around no subscribers for this channel. Progress at least and in case you hadn't guessed I'm pretty new to Spring!

Upvotes: 1

Views: 1116

Answers (1)

Gary Russell
Gary Russell

Reputation: 174709

If you are not interested in the result of the rm, set the reply-channel to nullChannel.

It's like /dev/null on unix.

Upvotes: 1

Related Questions