0

私はFileSystemPersistentAcceptOnceFileListFilterandを使用しPropertiesPersistingMetadataStoreて、新しいファイル(または)同じ名前のファイル(または)同じファイルが変更されたかどうかを確認し、ペイロードがファイルを呼び出す必要があります。しかし、既存のファイルが時間とともに変更/変更されたことをリッスンしていません。

この問題を解決するための良い解決策を提案してください

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

}

4

1 に答える 1

1

FileSystemPersistentAcceptOnceFileListFilter、転送後のローカル ファイル用です。要件を満たすためにFtpPersistentAcceptOnceFileListFilter、リモート エントリにも同様のものがあります。

于 2016-06-22T14:10:03.580 に答える