0

我正在使用 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;
    }
}

4

1 回答 1

1

改用ChainFileListFilter

/**
 * The {@link CompositeFileListFilter} extension which chains the result
 * of the previous filter to the next one. If a filter in the chain returns
 * an empty list, the remaining filters are not invoked.
 *
 * @param <F> The type that will be filtered.
 *
 * @author Artem Bilan
 * @author Gary Russell
 * @author Cengis Kocaurlu
 *
 * @since 4.3.7
 *
 */
public class ChainFileListFilter<F> extends CompositeFileListFilter<F> {

https://docs.spring.io/spring-integration/docs/current/reference/html/file.html#file-reading

从版本 4.3.7 开始,引入了ChainFileListFilter( 的扩展名,CompositeFileListFilter)以允许后续过滤器只能看到前一个过滤器的结果的情况。( 使用CompositeFileListFilter,所有过滤器都会看到所有文件,但它只传递已通过的文件所有过滤器)......

于 2021-03-18T13:54:37.110 回答