【问题标题】:Spring FTP Integration should look for modified file with same nameSpring FTP Integration 应该寻找具有相同名称的修改文件
【发布时间】:2016-06-22 12:40:31
【问题描述】:

我正在使用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);
}

}

【问题讨论】:

    标签: spring-integration spring-integration-sftp


    【解决方案1】:

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

    【讨论】:

    • 谢谢阿特姆!!我已经添加了代码中提到的过滤器,但过滤器不会查找已修改的现有文件。请查看代码并帮助我解决此问题。
    • 没有意义。请尝试调试AbstractInboundFileSynchronizer.synchronizeToLocalDirectory(),当它运行List&lt;F&gt; filteredFiles = filterFiles(files);。不要手动执行`fileSynchronizer.synchronizeToLocalDirectory(Temp);`和`fileSynchronizer.afterPropertiesSet();`。最后将synchronizer() 变成@Bean
    • 谢谢阿特姆!!我做了与您提到的相同的更改,但我现在无法复制任何文件。我正在尝试传输过滤器前缀可以是“* .xml”的 xml 文件,并且我将元存储用于两个过滤器。请让我知道我哪里出错了。
    • 您对远程和本地过滤器使用相同的metadataStore,并且它们都使用相同的"*.xml"prefix,这不是您可能期望的文件名模式。请考虑不同的前缀,最后将MetadataStore 设为@Bean!我让你调试代码。既然你有这么多乱七八糟的东西,我不知道如何帮助你。也尝试在下一个测试周期之前清理本地目录和metadata 属性文件。
    • 感谢 Artem!前缀,我添加了前缀“.*\\.xml$”并修改了元数据存储到@Bean,它开始寻找新文件。当我尝试调试我的两个过滤器的配置位置但如果我放置现有文件我的调试要点不是 ServiceActivator 方法。我不明白为什么如果我修改相同的内容,即使它与本地文件夹同步,它也不会选择修改后的文件。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-11
    • 2015-03-26
    • 2011-01-27
    相关资源
    最近更新 更多