使用 SftpInboundAdapter 和 RemoteDirectoryExpression 轮询不同的远程目录

Poll different remote directories using SftpInboundAdapter and RemoteDirectoryExpression

我有一个应用程序使用 spring 集成从 SFTP 轮询文件并处理它们。 sftp 的结构将始终相似,但将创建新文件夹。示例:

/sales/client1/in
/sales/client2/in
...
/sales/clientN/in

我正在使用 Sftp 入站适配器轮询 SFTP 服务器并启动流程,例如:

@Bean
public IntegrationFlow flow() {
    return IntegrationFlows.from(
            Sftp.inboundAdapter(sftpSessionFactory())
                    .preserveTimestamp(true)
                    .localDirectory(new File("sftp-inbound"))
                    .deleteRemoteFiles(true)
                    .autoCreateLocalDirectory(true)
                    .remoteDirectoryExpression(
                            EXPRESSION_PARSER.parseExpression("@directoryProvider.getDirectory()"))
                    .filter(getFilter())
            , e -> e.id("sftpInboundAdapter")
                    .autoStartup(true)
                    .poller(Pollers.fixedDelay(5, TimeUnit.SECONDS)))
            .log()
            .channel("processing")
            .get();
}

bean directoryProvider 将从数据库中获取文件夹并将循环返回每个文件夹,根据我从文档中了解到的内容:

Starting with version 4.2, you can specify remote-directory-expression instead of remote-directory, letting you dynamically determine the directory on each poll — for example, remote-directory-expression="@myBean.determineRemoteDir()"

这正是我所需要的,但是,方法 getDirectory 仅在创建 IntegrationFlow 时执行两次,而不是在每次轮询时获取一个新文件夹,它使用检索到的第二个文件夹并不再询问

我是不是理解错了文档?有没有一种简单的方法可以做到这一点,比如中间文件夹结构的通配符? sales/*/in ?谢谢!

参见Inbound Channel Adapters: Polling Multiple Servers and Directories

使用带有自定义 RotationPolicyRotatingServerAdvice

或者使用出站网关,使用递归 MGET 命令。

https://docs.spring.io/spring-integration/docs/current/reference/html/sftp.html#sftp-outbound-gateway