Spring Integration SFTP:删除或删除多个文件

时间:2015-06-04 13:55:32

标签: java spring integration spring-integration sftp

使用Spring Integration我想在远程SFTP服务器上一次移动或删除多个文件或非空文件夹。但我似乎无法在官方Spring docs中找到对此的支持,因为它似乎没有得到支持。虽然文档总是不正确。

我在考虑使用int-sftp:outbound-gatewayrm命令以及目录名称的有效负载。但它似乎没有用。我还没有尝试使用mv,但我想知道是否有人在Spring Integration中有过这种行为的经验。

3 个答案:

答案 0 :(得分:0)

您的问题不是很清楚:您要在SFTP服务器上删除本地应用程序或远程文件?

以下是我的应用程序中的一个示例,也许可以提供帮助:传入的消息(有效负载中的文件名)首先发送到远程SFTP服务器,然后在本地删除

<integration:publish-subscribe-channel
    id="sftpChannel" />

<!-- The processed file will be sftped to the server -->
<sftp:outbound-channel-adapter id="sftpOutboundAdapter"
    session-factory="sftpSessionFactory" channel="sftpChannel" order="1"
    charset="UTF-8" remote-file-separator="/" remote-directory="${sftp.remote.directory}"
    remote-filename-generator-expression="payload.getName()" mode="REPLACE" />

<!-- sftped file will be removed from the staging folder -->
<integration:service-activator
    input-channel="sftpChannel" output-channel="nullChannel" ref="sftpFileDeleter"
    method="deleteAfterSftpingFile" order="2" />

使用SftpFileDeleter

public class SftpFileDeleter {

private static final Logger LOGGER = Logger
        .getLogger(SftpFileDeleter.class);

@ServiceActivator
public void deleteAfterSftpingFile(Message<File> fileMessage) throws IOException{
    Path fileToDeletePath = Paths.get(fileMessage.getPayload().getAbsolutePath());
    Files.delete(fileToDeletePath);

    LOGGER.info("[SENT]File Sent to Sftp Server and deleted:"+fileToDeletePath.getFileName());


}

}

答案 1 :(得分:0)

你看过这个例子了吗?

https://github.com/spring-projects/spring-integration-samples/blob/master/basic/sftp/src/test/resources/META-INF/spring/integration/SftpOutboundGatewaySample-context.xml

看起来这正是你想要做的。但是你可能做错的一件事是,根据文档(http://docs.spring.io/spring-integration/reference/html/sftp.html,第26.7节),收到的消息的有效负载不必包含文件名:你需要小心标题虽然,并使用正确的值设置正确的属性(在您的情况下为file_remoteDirectory / file_remoteFile)。

我不知道您当前的配置,但您可能需要在SFTP出站网关之前使用消息转换器,以将信息从有效负载移动到消息的标头。

答案 2 :(得分:0)

我在Spring上编写自己的代码解决了这个问题,正如@Vincent_F建议的那样。首先,您需要autowire SFTP会话工厂,如下所示:

@Autowired
private DefaultSftpSessionFactory sftpSessionFactory;

在我的情况下,会话可以用来重命名目录。这可能也适用于默认的Spring DSL或XML,但我无法使它工作......这是我自己的代码与此用例相关:

SftpSession session = sftpSessionFactory.getSession();

try {
    if (!session.exists(sftpConfiguration.getOtherRemoteDirectory())) {
        throw new FileNotFoundException("Remote directory does not exists... Continuing");
    }

    for (ChannelSftp.LsEntry entry : session.list(sftpConfiguration.getRemoteDirectory())) {
        if (entry.getFilename().equalsIgnoreCase(sftpConfiguration.getOtherDirectory())) {
            session.rename(sftpConfiguration.getOtherRemoteDirectory(), String.format("%s%s-%s",
                    sftpConfiguration.getRemoteDirectory(), sftpConfiguration.getReportDirectory(),
                    this.createDate(new Integer(entry.getAttrs().getMTime()).longValue() * 1000)));
        }
    }
} catch (FileNotFoundException e) {
    logger.error(e.getMessage());
} catch (IOException e) {
    logger.error("Could not rename remote directory.", e);
}