入站通道适配器:轮询多个服务器和目录
從 5.0.7 版開始,RotatingServerAdvice
可用;當設定為 poller advice 時,入站适配器可以輪詢多個伺服器和目錄。正常設定 advice 並將其新增至 poller 的 advice 鏈。DelegatingSessionFactory
用於選擇伺服器,請參閱 委派 Session Factory 以取得更多資訊。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
,直到沒有新檔案存在,然後移至目錄 bar
,再移至伺服器 two
上的目錄 baz
,依此類推。
可以使用 fair
建構子引數修改此預設行為
fair
@Bean
public RotatingServerAdvice advice() {
...
return new RotatingServerAdvice(delegatingSf(), keyDirectories, true);
}
在此情況下,無論先前的輪詢是否傳回檔案,advice 都會移至下一個伺服器/目錄。
或者,您可以提供自己的 RotationPolicy
以根據需要重新設定訊息來源
policy
public interface RotationPolicy {
void beforeReceive(MessageSource<?> source);
void afterReceive(boolean messageReceived, MessageSource<?> source);
}
和
custom
@Bean
public RotatingServerAdvice advice() {
return new RotatingServerAdvice(myRotationPolicy());
}
local-filename-generator-expression
屬性(同步器上的 localFilenameGeneratorExpression
)現在可以包含 #remoteDirectory
變數。這允許從不同目錄擷取的檔案下載到本機的類似目錄
@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();
}
使用此 advice 時,請勿在 poller 上設定 TaskExecutor ;請參閱 訊息來源的條件式 Poller 以取得更多資訊。 |