2

我有 ftp 位置文件和本地文件夹,在第一次将文件复制到本地并重新启动服务器时(当前它正在将已复制的文件复制到本地文件夹)它不应该查找已经存在的文件本地,它应该只查找新文件。请让我知道是否可以使用 Spring-Integration ftp 来实现它?我也添加了过滤器,但仍然无法正常工作,请告诉我哪里出错了,

@Bean
@InboundChannelAdapter(value = "inputChannel", poller = @Poller(fixedDelay = "1000", maxMessagesPerPoll = "1"))
public MessageSource<?> receive() {
    FtpInboundFileSynchronizingMessageSource messageSource = new FtpInboundFileSynchronizingMessageSource(synchronizer());
    PropertiesPersistingMetadataStore metadataStore = new PropertiesPersistingMetadataStore();
    FileSystemPersistentAcceptOnceFileListFilter acceptOnceFilter = new FileSystemPersistentAcceptOnceFileListFilter(metadataStore,"*.xml");

    File Temp = new File(TEMP_FOLDER);

    metadataStore.setBaseDirectory(TEMP_FOLDER);
    messageSource.setLocalDirectory(Temp);
    messageSource.setAutoCreateLocalDirectory(false);

    messageSource.setLocalFilter(acceptOnceFilter);

    return messageSource;
}

private AbstractInboundFileSynchronizer<FTPFile> synchronizer() {
    folderCleanUp();
    AbstractInboundFileSynchronizer<FTPFile> fileSynchronizer = new FtpInboundFileSynchronizer(sessionFactory());
    fileSynchronizer.setRemoteDirectory(ftpFileLocation);
    fileSynchronizer.setDeleteRemoteFiles(false);
    Pattern pattern = Pattern.compile(".*\\.xml$");
    FtpRegexPatternFileListFilter ftpRegexPatternFileListFilter = new FtpRegexPatternFileListFilter(pattern);
    fileSynchronizer.setFilter(ftpRegexPatternFileListFilter);
    return fileSynchronizer;
}
4

2 回答 2

1

为了澄清Artem关于实现您的 custom的建议FileListFilter,这里是这样一个过滤器的示例(旨在过滤掉比给定时刻更旧的文件):

@Component
public class OldFilesFilter extends AbstractFileListFilter<FTPFile> {
  // (oldFilesTimestamp field declaration and its source)

  @Override
  protected boolean accept(FTPFile file) {
    String fileName = file.getName();
    long fileTimestamp = file.getTimestamp().getTimeInMillis();
    ZonedDateTime fileModTimestamp = ZonedDateTime.ofInstant(Instant.ofEpochMilli(fileTimestamp), ZoneId.systemDefault());
    boolean isFileAcceptable = fileModTimestamp.isAfter(oldFilesTimestamp);
    if (log.isTraceEnabled()) {
      log.trace("File {}:\n" +
          "file timestamp : {};\n" +
          "given timestamp: {};\n" +
          "file is new    : {}",
          fileName, fileModTimestamp, oldFilesTimestamp, isFileAcceptable);
    }
    return isFileAcceptable;
  }
}

另请注意,Spring Integration 允许同时将多个过滤器应用于单个文件源。这可以通过以下方式实现CompositeFileListFilter

  private CompositeFileListFilter<FTPFile> remoteFileFilter() {
    FtpPersistentAcceptOnceFileListFilter persistentFilter =
                            new FtpPersistentAcceptOnceFileListFilter(metadataStore, "remoteProcessedFiles.");
    return new CompositeFileListFilter<>(Arrays.asList(new FtpSimplePatternFileListFilter("*.zip"),
                                                       persistentFilter,
                                                       oldFilesFilter /*known from previous example*/));
  }
于 2017-03-07T02:41:16.807 回答
0

是的。查看该local-filter属性,FileSystemPersistentAcceptOnceFileListFilter您可以通过外部跟踪本地文件MetadataStore,例如 Redis、MongoDb 或任何其他在系统重新启动时保留数据的文件。

于 2016-06-13T16:14:27.090 回答