入站通道介面卡:輪詢多個伺服器和目錄

從版本 5.0.7 開始,RotatingServerAdvice 可用;當配置為輪詢器 advice 時,入站介面卡可以輪詢多個伺服器和目錄。像往常一樣配置 advice 並將其新增到輪詢器的 advice 鏈中。使用 DelegatingSessionFactory 來選擇伺服器,詳情請參閱 委託 Session 工廠。 advice 配置包含一個 RotationPolicy.KeyDirectory 物件列表。

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

這個 advice 將輪詢伺服器 one 上的目錄 foo,直到沒有新檔案存在,然後移至伺服器 two 上的目錄 bar,接著是目錄 baz,等等。

這個預設行為可以透過 fair 建構函式引數進行修改

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

在這種情況下,無論之前的輪詢是否返回了檔案,advice 都會移至下一個伺服器/目錄。

或者,您可以提供自己的 RotationPolicy 來根據需要重新配置訊息源

策略
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 屬性(synchronizer 上的 localFilenameGeneratorExpression)現在可以包含 #remoteDirectory 變數。這允許從不同目錄檢索的檔案下載到本地類似的目錄中。

@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();
}
使用此 advice 時,不要在 poller 上配置 TaskExecutor;詳情請參閱 訊息源的條件輪詢器

當不是所有獲取的檔案都在一個輪詢週期內處理完畢,但 SessionFactory 可能會輪換到不同的 SessionFactory 時,還可以參閱便捷的 AbstractRemoteFileStreamingMessageSource.clearFetchedCache() API。