1

我正在尝试将远程文件从 FTP 存储库传输到本地存储库。目前它在初始传输方面起作用,如果本地文件被删除,但我希望它能够从上次修改的时间戳中获取远程文件更改。我已经阅读了尝试创建自定义过滤器的信息,但找不到太多关于通过 Java DSL 执行此操作的信息。

@Bean
public IntegrationFlow ftpInboundFlow(){
    return IntegrationFlows
            .from(s -> s
                    .ftp(this.ftpSessionFactory())
                            .preserveTimestamp(true)
                            .remoteDirectory(ftpData.getRemoteDirectory())
                            .localDirectory(new File(ftpData.getLocalDirectory())),
                    e -> e.id("ftpInboundAdapter").autoStartup(true))
            .channel(MessageChannels.publishSubscribe())
            .get();
}
4

1 回答 1

0

它最近才被修复:https ://jira.spring.io/browse/INT-4232 。

同时您别无选择,除非在处理后删除本地文件。

您必须使用FtpPersistentAcceptOnceFileListFilter任何方式,因为:https ://jira.spring.io/browse/INT-4115 。

从 Java DSL 的角度来看,什么都没有。

更新

你能告诉我如何通过 Java DSL 删除本地文件吗

FtpInboundFileSynchronizingMessageSource已经为本地文件生成了一条消息作为有效负载。此外还有一些标题,例如:

.setHeader(FileHeaders.RELATIVE_PATH, file.getAbsolutePath()
                        .replaceFirst(Matcher.quoteReplacement(this.directory.getAbsolutePath() + File.separator),
                                ""))
.setHeader(FileHeaders.FILENAME, file.getName())
.setHeader(FileHeaders.ORIGINAL_FILE, file)

完成下游文件后,您可以通过常规File.delete()操作将其删除。例如,可以使用ExpressionEvaluatingRequestHandlerAdvice

@Bean
public Advice deleteFileAdvice() {
    ExpressionEvaluatingRequestHandlerAdvice advice = new ExpressionEvaluatingRequestHandlerAdvice();
    advice.setOnSuccessExpressionString("headers[file_originalFile].delete()");
    return advice;
}

...
.<String>handle((p, h) -> ..., e -> e.advice(deleteFileAdvice()))
于 2017-03-01T14:40:21.577 回答