2016-06-13 3 views
2

У меня есть файлы местоположения ftp и есть локальная папка, в первый раз файлы копируются в локальные и при перезапуске сервера (в настоящее время он копирует уже скопированные файлы в локальную папку). не следует искать файлы, которые уже существуют в локальном, и он должен искать только новые файлы. Пожалуйста, дайте мне знать, можно ли достичь этого, используя Spring-Integration 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; 
} 

ответ

0

Да, это так. Посмотрите на свойство local-filter, а FileSystemPersistentAcceptOnceFileListFilter - для отслеживания локальных файлов через внешний MetadataStore, например. Redis, MongoDb или любой другой, который сохраняет данные по перезапуску системы.

+0

Независимо от фильтров файлы, которые уже находятся в локальном каталоге, не копируются повторно; см. [синхронизированный код здесь] (https://github.com/spring-projects/spring-integration/blob/master/spring-integration-file/src/main/java/org/springframework/integration/file/remote/ синхронизатор/AbstractInboundFileSynchronizer.java # L293). Локальный фильтр должен быть постоянным, чтобы предотвратить отправку сообщений для уже обработанных файлов после перезапуска. –

+0

Спасибо Artem, я добавил указанный выше код фильтра , но все же он не работает, еще что-то еще нужно сделать – user3428736

+0

Спасибо @GaryRussell, мне нужно скопировать тот же файл (уже скопированный в локальный файл), если есть данные, измененные и заменен на ftp, и если я попытаюсь перезапустить сервер, все будет скопировано на локальное. Вместо того, чтобы мне нужно скопировать только файл изменений и заменить локальный, даже без перезапуска сервера. Пожалуйста, дайте мне знать, что я должен делать. – user3428736

0

Для уточнения Artem's advice о реализации ваших пользовательских 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 позволяет использовать несколько фильтров, которые должны применяться к одному источнику файла в одно и то же время. Это может быть достигнуто с помощью :

private CompositeFileListFilter<FTPFile> remoteFileFilter() { 
    FtpPersistentAcceptOnceFileListFilter persistentFilter = 
          new FtpPersistentAcceptOnceFileListFilter(metadataStore, "remoteProcessedFiles."); 
    return new CompositeFileListFilter<>(Arrays.asList(new FtpSimplePatternFileListFilter("*.zip"), 
                 persistentFilter, 
                 oldFilesFilter /*known from previous example*/)); 
    }