Spring FTP Integration应查找具有相同名称的已修改文件

时间:2016-06-22 12:40:31

标签: spring-integration spring-integration-sftp

我正在使用FileSystemPersistentAcceptOnceFileListFilterPropertiesPersistingMetadataStore检查是否有任何新文件(或)任何具有相同名称(或)相同文件的文件已被修改,然后有效负载应调用该文件。但它并没有随着时间的推移监听现有的文件被修改/修改。

请为解决此问题提出任何有用的解决方案

@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);
}

}

1 个答案:

答案 0 :(得分:1)

FileSystemPersistentAcceptOnceFileListFilter用于传输后的本地文件。为了满足您的要求,远程条目的FtpPersistentAcceptOnceFileListFilter类似。