spring - Spring Integration 文件同步器:根据预定义的列表接受文件
问题描述
我正在通过 Sftp 将文件从远程传输到本地进行处理。我只想传输 .csv 文件,并且我有一个预定义文件名列表。
我找不到允许指定多个模式并在至少一个匹配时传输的 FileListFilter。
到目前为止,我有这段代码,它适用于“.csv”过滤。
集成流程
@Bean
public IntegrationFlow integFlow() {
return IntegrationFlows
.from(ftpMessageSource(), c -> poller())
... more processing
消息源
public MessageSource<File> ftpMessageSource() {
SftpInboundFileSynchronizer fileSynchronizer = new SftpInboundFileSynchronizer(sessionFactory);
fileSynchronizer.setRemoteDirectory(remoteDirectory);
fileSynchronizer.setDeleteRemoteFiles(true);
fileSynchronizer.setFilter(new SftpRegexPatternFileListFilter(Constantes.EXTENSION));
SftpInboundFileSynchronizingMessageSource ftpInboundFileSync =
new SftpInboundFileSynchronizingMessageSource(fileSynchronizer);
ftpInboundFileSync.setLocalDirectory(new File(workDirectory));
ftpInboundFileSync.setAutoCreateLocalDirectory(true);
CompositeFileListFilter<File> compositeFileListFilter = new CompositeFileListFilter<>();
compositeFileListFilter.addFilter(new RegexPatternFileListFilter(Constantes.EXTENSION));
ftpInboundFileSync.setLocalFilter(compositeFileListFilter);
return ftpInboundFileSync;
}
Constantes.EXTENSION 是一个接受 .csv 和 .CSV 的正则表达式。这工作正常。
假设我有一个包含“string1”、“string2”、“string3”的字符串列表,我想传输字符串 1*、string2* 或 string3* 形式的每个文件。我将如何进行?
解决方案
@SpringBootApplication
public class So59161698Application {
public static void main(String[] args) {
SpringApplication.run(So59161698Application.class, args);
}
private final String myPatterns = "foo,bar,baz";
@Bean
public FileListFilter<File> filter() {
Set<String> patterns = StringUtils.commaDelimitedListToSet(this.myPatterns);
return files -> Arrays.stream(files)
.filter(file -> patterns.stream()
.filter(pattern -> file.getName().startsWith(pattern))
.findFirst()
.isPresent())
.collect(Collectors.toList());
}
@Bean
public ApplicationRunner runner(FileListFilter<File> filter) {
return args -> {
System.out.println(filter.filterFiles(new File[] {
new File("foo.csv"),
new File("bar.csv"),
new File("baz.csv"),
new File("qux.csv")
}));
};
}
}
[foo.csv, bar.csv, baz.csv]
推荐阅读
- c++ - 为什么将指针分配给双变量时出现错误
- arrays - 在 Mongo 中,映射数组并更新文档
- linux - abyss-pe:使用一个命令组装多个基因组的变量
- php - 重复捕获正则表达式
- elixir - 使用返回元组的函数更新地图列表
- javascript - 如何使用指针事件覆盖 Firefox 和 chrome 中的触摸缩放和平移
- ag-grid - 为什么启用企业版时过滤 UI 会发生变化?
- esp8266 - ESP32(DOIT DevKit)如何通过 mDNS 在同一个 LAN 中找到另一台主机?
- arrays - 在 let 常量数组中初始化并存储对象的 N 个实例?
- ios - 错误的 Module-Swift.h 标头是通过导入到自身生成的