此版本仍在开发中,尚不被认为是稳定的。对于最新的稳定版本,请使用 Spring Integration 6.5.1spring-doc.cadn.net.cn

入站通道适配器:轮询多个服务器和目录

从 5.0.7 版本开始,RotatingServerAdvice可用;当配置为轮询器通知时,入站适配器可以轮询多个服务器和目录。 配置通知并将其正常添加到轮询器的通知链中。 一个DelegatingSessionFactory用于选择服务器,请参阅委托会话工厂了解更多信息。 通知配置由以下列表组成RotationPolicy.KeyDirectory对象。spring-doc.cadn.net.cn

示例
@Bean
public RotatingServerAdvice advice() {
    List<RotationPolicy.KeyDirectory> keyDirectories = new ArrayList<>();
    keyDirectories.add(new RotationPolicy.KeyDirectory("one", "foo"));
    keyDirectories.add(new RotationPolicy.KeyDirectory("one", "bar"));
    keyDirectories.add(new RotationPolicy.KeyDirectory("two", "baz"));
    keyDirectories.add(new RotationPolicy.KeyDirectory("two", "qux"));
    keyDirectories.add(new RotationPolicy.KeyDirectory("three", "fiz"));
    keyDirectories.add(new RotationPolicy.KeyDirectory("three", "buz"));
    return new RotatingServerAdvice(delegatingSf(), keyDirectories);
}

此建议将轮询目录foo在服务器上one直到没有新文件存在,然后移动到目录bar然后是目录baz在服务器上two等。spring-doc.cadn.net.cn

可以使用fair构造函数 arg:spring-doc.cadn.net.cn

公平
@Bean
public RotatingServerAdvice advice() {
    ...
    return new RotatingServerAdvice(delegatingSf(), keyDirectories, true);
}

在这种情况下,通知将移动到下一个服务器/目录,而不管上一个轮询是否返回了文件。spring-doc.cadn.net.cn

或者,您可以提供自己的RotationPolicy要根据需要重新配置消息源,请执行以下作:spring-doc.cadn.net.cn

政策
public interface RotationPolicy {

    void beforeReceive(MessageSource<?> source);

    void afterReceive(boolean messageReceived, MessageSource<?> source);

}
习惯
@Bean
public RotatingServerAdvice advice() {
    return new RotatingServerAdvice(myRotationPolicy());
}

local-filename-generator-expression属性 (localFilenameGeneratorExpression)现在可以包含#remoteDirectory变量。 这允许从不同目录检索到的文件下载到本地的类似目录:spring-doc.cadn.net.cn

@Bean
public IntegrationFlow flow() {
    return IntegrationFlow.from(Ftp.inboundAdapter(sf())
                    .filter(new FtpPersistentAcceptOnceFileListFilter(new SimpleMetadataStore(), "rotate"))
                    .localDirectory(new File(tmpDir))
                    .localFilenameExpression("#remoteDirectory + T(java.io.File).separator + #root")
                    .remoteDirectory("."),
                e -> e.poller(Pollers.fixedDelay(1).advice(advice())))
            .channel(MessageChannels.queue("files"))
            .get();
}
不要配置TaskExecutor使用此建议时对轮询者;有关详细信息,请参阅消息源的条件轮询器。