2016-06-22 20 views
0

Ich verwende FileSystemPersistentAcceptOnceFileListFilter und PropertiesPersistingMetadataStore, um zu überprüfen, ob es neue Datei (oder) eine Datei mit demselben Namen (oder) gleiche Datei wurde geändert, dann die Nutzlast sollte die Datei aufrufen . Aber es hört nicht auf die existierende Datei, die mit der Zeit modifiziert/modifiziert wurde.Spring FTP-Integration sollte für geänderte Datei mit dem gleichen Namen suchen

vorschlagen Bitte jede gute Lösung

dieses Problem zur Lösung
@Bean 
@InboundChannelAdapter(value = "inputChannel", poller = @Poller(fixedDelay = "1000", maxMessagesPerPoll = "1")) 
public MessageSource<File> receive() throws Exception { 
    FtpInboundFileSynchronizingMessageSource messageSource = new FtpInboundFileSynchronizingMessageSource(
      synchronizer()); 
    Logger.info(messageSource, "receive "); 
    messageSource.setLocalDirectory(Temp); 
    messageSource.setAutoCreateLocalDirectory(true); 
    messageSource 
      .setLocalFilter(fileSystemPersistentAcceptOnceFileListFilter()); 
    return messageSource; 
} 

@Bean 
public FileListFilter<FTPFile> compositeFilter() throws Exception { 

    Pattern pattern = Pattern.compile(".*\\.xml$"); 
    CompositeFileListFilter<FTPFile> compositeFileListFilter = new CompositeFileListFilter<FTPFile>(); 
    FileListFilter<FTPFile> fileListFilter = new FtpRegexPatternFileListFilter(
      pattern); 
    compositeFileListFilter.addFilter(fileListFilter); 
    compositeFileListFilter.addFilter(getAcceptOnceFileFilter()); 
    Logger.info(compositeFileListFilter.getClass().getName(), " compositeFilter "); 
    return compositeFileListFilter; 
} 

@Bean 
public FileListFilter<FTPFile> getAcceptOnceFileFilter() { 

    FileListFilter<FTPFile> ftpPersistentAcceptOnceFileListFilter = null; 
    try { 
     ftpPersistentAcceptOnceFileListFilter = new FtpPersistentAcceptOnceFileListFilter(
       getMetadataStore(), "######"); 


    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    Logger.info(ftpPersistentAcceptOnceFileListFilter.getClass().getName(), " getAcceptOnceFileFilter "); 
    return ftpPersistentAcceptOnceFileListFilter; 

} 

@Bean 
public PropertiesPersistingMetadataStore getMetadataStore() 
     throws Exception { 
    PropertiesPersistingMetadataStore metadataStore = new PropertiesPersistingMetadataStore(); 
    metadataStore.setBaseDirectory("temp"); 
    metadataStore.afterPropertiesSet(); 
    Logger.info(metadataStore.getClass().getName(), " metadataStore "); 
    return metadataStore; 
} 

@Bean 
public AbstractInboundFileSynchronizer<FTPFile> synchronizer() 
     throws Exception { 
    AbstractInboundFileSynchronizer<FTPFile> fileSynchronizer = new FtpInboundFileSynchronizer(
      sessionFactory()); 
    fileSynchronizer.setRemoteDirectory("/RemoteFile/"); 
    fileSynchronizer.setDeleteRemoteFiles(false); 
    fileSynchronizer.setFilter(compositeFilter()); 
    Logger.info(fileSynchronizer.getClass().getName(), " fileSynchronizer "); 
    return fileSynchronizer; 
} 

@Bean 
public FileSystemPersistentAcceptOnceFileListFilter fileSystemPersistentAcceptOnceFileListFilter() { 
    ConcurrentMetadataStore metaDataStore; 
    FileSystemPersistentAcceptOnceFileListFilter fileSystemPersistentFilter = null; 
    try { 
     metaDataStore = getMetadataStore(); 
     fileSystemPersistentFilter = new FileSystemPersistentAcceptOnceFileListFilter(
       metaDataStore, "######"); 
     fileSystemPersistentFilter.setFlushOnUpdate(true); 

     return fileSystemPersistentFilter; 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    Logger.info(fileSystemPersistentFilter.getClass().getName(), " fileSystemPersistentFilter "); 
    return fileSystemPersistentFilter; 

} 

@Bean(name = "sessionFactory") 
public SessionFactory<FTPFile> sessionFactory() throws SocketException, IOException { 
    DefaultFtpSessionFactory ftp = new DefaultFtpSessionFactory(); 
    ftp.setHost(hostName); 
    ftp.setUsername(username); 
    ftp.setPassword(passWord); 
    ftp.setBufferSize(1000); 

    return ftp; 
} 

@Bean(name = "inputChannel") 
public PollableChannel inputChannel() { 
    QueueChannel channel = new QueueChannel(); 
    return channel; 
} 

@Bean(name = PollerMetadata.DEFAULT_POLLER) 
public PollerMetadata defaultPoller() { 

    PollerMetadata pollerMetadata = new PollerMetadata(); 
    pollerMetadata.setTrigger(new PeriodicTrigger(10)); 
    return pollerMetadata; 
} 

@ServiceActivator(inputChannel = "inputChannel") 
public void foo(String payload) { 

    System.out.println("payload: " + payload); 
} 

}

Antwort

1

Die FileSystemPersistentAcceptOnceFileListFilter für lokale Dateien ist nach der Übertragung bereits. Um Ihre Anforderungen zu erfüllen, gibt es ähnliche FtpPersistentAcceptOnceFileListFilter für Remote-Einträge.

+0

Dank Artem !! Ich habe den Filter wie im Code erwähnt hinzugefügt, aber der Filter sucht nicht nach bereits vorhandenen Dateien, die modifiziert werden. Bitte schauen Sie in den Code und helfen Sie mir, dieses Problem zu beheben. – user3428736

+0

Macht keinen Sinn. Bitte versuchen Sie 'AbstractInboundFileSynchronizer.synchronizeToLocalDirectory()' zu debuggen, wenn es 'List filteredFiles = filterFiles (files);'. Führen Sie 'fileSynchronizer.synchronizeToLocalDirectory (Temp);' und 'fileSynchronizer.afterPropertiesSet();' nicht manuell aus. Und make 'synchronizer()' endlich als '@ Bean'! –

+0

Danke Artem !! Ich habe die gleichen Änderungen wie Sie erwähnt, aber ich konnte jetzt keine Dateien kopieren. Ich versuche, xml-Dateien zu übertragen, wo das Filter-Präfix "* .xml" sein kann und ich verwende den Metastore für beide Filter. Bitte lassen Sie mich wissen, wo ich falsch liege. – user3428736