私の意図は、さまざまなソース/ディレクトリから (最初は、後でおそらく ftp から) IntegrationFlow Bean インスタンスを作成することです。したがって、application.properties
このようなものを定義したいのですが、受信ディレクトリの数は異なる場合があります。
inbound.file.readPath[0]=source1
inbound.file.processedPath[0]=processed1
inbound.file.failedPath[0]=failed1
inbound.file.readPath[1]=source2
inbound.file.processedPath[1]=processed2
inbound.file.failedPath[1]=failed2
また、ソースのオリジンを (ヘッダー エンリッチメントを介して) 維持したいので、すべてのファイルを春以外の 1 つのディレクトリに配置するオプションはありません。
FilePollingFlow を使用すると、上記のプロパティからこれらの Bean インスタンスを作成できますか? このようなことを想像することはできますが、プロパティを Bean インスタンスに渡す方法とインデックスを参照する方法がわかりません。
@Configuration
public class FilePollingIntegrationFlow extends AbstractFactoryBean<IntegrationFlow> {
@Autowired
private FilePollingConfiguration config;
@Override
public Class<IntegrationFlow> getObjectType() {
return IntegrationFlow.class;
}
@Override
protected IntegrationFlow createInstance() throws Exception {
return IntegrationFlows
.from(s -> /* FIXME config.getReadPath()? instead of inboundReadDirectory, but how to handle indices? */s.file(inboundReadDirectory).preventDuplicates(true).scanEachPoll(true).patternFilter("*.txt"),
e -> e.poller(Pollers.fixedDelay(inboundPollingPeriod)
.taskExecutor(taskExecutor())
.transactionSynchronizationFactory(transactionSynchronizationFactory())
.transactional(transactionManager())))
.log(LoggingHandler.Level.INFO, getClass().getName(), "'Read inbound file: ' .concat(payload)")
.enrichHeaders(m -> m.headerExpression(FileHeaders.ORIGINAL_FILE, "payload"))
.transform(Transformers.fileToString())
.channel(ApplicationConfiguration.FILE_INBOUND_CHANNEL)
.get();
}
}
@Component
@ConfigurationProperties("inbound")
public class FilePollingConfiguration {
private List<File> files = new ArrayList<>();
public static class File {
private String readPath;
private String processedPath;
private String failedPath;
public String getReadPath() {
return readPath;
}
public void setReadPath(String readPath) {
this.readPath = readPath;
}
public String getProcessedPath() {
return processedPath;
}
public void setProcessedPath(String processedPath) {
this.processedPath = processedPath;
}
public String getFailedPath() {
return failedPath;
}
public void setFailedPath(String failedPath) {
this.failedPath = failedPath;
}
@Override
public String toString() {
return new ToStringBuilder(this)
.append("readPath", readPath)
.append("processedPath", processedPath)
.append("failedPath", failedPath)
.toString();
}
public List<File> getFiles() {
return files;
}
public void setFiles(List<File> files) {
this.files = files;
}
}