2

私はftpロケーションファイルを持っており、ローカルフォルダーを持っています。初めてファイルがローカルにコピーされ、サーバーを再起動するとき(現在、すでにコピーされたファイルをローカルフォルダーにコピーしています)、すでに存在するファイルを探すべきではありませんlocal であり、新しいファイルのみを検索する必要があります。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

custom の実装に関するArtem のアドバイスを明確にするために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プロパティを見てください。Redis、MongoDb、またはシステムの再起動後もデータを保持するその他のFileSystemPersistentAcceptOnceFileListFilter外部経由でローカル ファイルを追跡できます。MetadataStore

于 2016-06-13T16:14:27.090 に答える