我正在使用 CompositeFileListFilter 添加两个过滤器。首先,我想使用默认实现执行 AbstractPersistentFileListFilter ,从而防止重复。其次,我使用自己的实现,它检查数据库是否存在文件,在系统重启时保护我免受重复
这种方法如何发布?这样就先执行带有MetadataStore内部内存的AbstractPersistentFileListFilter的默认实现
目标是减少检查文件是否存在的数据库调用。也许有更好的解决方法。谢谢你的帮助!
FtpConfiguration.java
@Bean
CompositeFileListFilter<FTPFile> getCompositeFileListFilter() {
CompositeFileListFilter<FTPFile> compositeFileListFilter = new CompositeFileListFilter<>();
compositeFileListFilter.addFilters(new CustomFileFilter(messageRepo));
return compositeFileListFilter;
}
@Bean
public IntegrationFlow ftpIntegrationFlow() {
return IntegrationFlows.from(
Ftp.inboundStreamingAdapter(template())
.filter(getCompositeFileListFilter())
.remoteDirectory("."),
e -> e.poller(Pollers.fixedDelay(500).advice(advice())))
.transform(new StreamTransformer("UTF-8"))
.handle(messageService::unmarshall)
.get();
}
自定义文件过滤器.java
@Component
@Log4j2
public class CustomFileFilter implements FileListFilter<FTPFile> {
private final MessageRepo messageRepo;
public CustomFileFilter(MessageRepo messageRepo) {
this.messageRepo = messageRepo;
}
@Override
public List<FTPFile> filterFiles(FTPFile[] files) {
return null;
}
@Override
public boolean accept(FTPFile file) {
String fileName = file.getName();
log.info("file filter get name: {}", fileName);
Integer fileCheck = messageRepo.checkExistsMessage(fileName);
log.info("fileCheck: {}", fileCheck);
return fileCheck != 1;
}
@Override
public boolean supportsSingleFileFiltering() {
return true;
}
}