对于最新的稳定版本,请使用 Spring Integration 6.3.1Spring中文文档

对于最新的稳定版本,请使用 Spring Integration 6.3.1Spring中文文档

从版本 5.0.7 开始,可用;当配置为轮询器建议时,入站适配器可以轮询多个服务器和目录。 配置建议并照常将其添加到轮询者的建议链中。 A 用于选择服务器,有关详细信息,请参阅委派会话工厂。 建议配置由对象列表组成。RotatingServerAdviceDelegatingSessionFactoryRotationPolicy.KeyDirectorySpring中文文档

@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);
}

此建议将轮询服务器上的目录,直到没有新文件存在,然后移动到目录,然后移动到服务器上的目录,等等。fooonebarbaztwoSpring中文文档

可以使用构造函数 arg 修改此默认行为:fairSpring中文文档

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

在这种情况下,无论上一次轮询是否返回文件,建议都将移动到下一个服务器/目录。Spring中文文档

或者,您可以根据需要提供自己的消息源来重新配置消息源:RotationPolicySpring中文文档

政策
public interface RotationPolicy {

    void beforeReceive(MessageSource<?> source);

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

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

属性(在同步器上)现在可以包含变量。 这允许将从不同目录检索到的文件下载到本地的类似目录:local-filename-generator-expressionlocalFilenameGeneratorExpression#remoteDirectorySpring中文文档

@Bean
public IntegrationFlow flow() {
    return IntegrationFlow.from(Sftp.inboundAdapter(sf())
                    .filter(new SftpPersistentAcceptOnceFileListFilter(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();
}
使用此建议时,请勿在轮询器上配置 a;有关详细信息,请参阅消息源的条件轮询器TaskExecutor
使用此建议时,请勿在轮询器上配置 a;有关详细信息,请参阅消息源的条件轮询器TaskExecutor