Spring FTP集成:当远程目录有5000000个文件时非常慢

时间:2017-02-07 22:27:57

标签: spring spring-integration

我正在使用流动代码。远程目录有超过5000000个文件(我知道它是坏的)。我希望从那里只获取一个文件(myFile.txt)和相同的文件在非固定的时间间隔更新,然后我必须再次获取它。 Spring FTP集成工作就像魅力一样,但更新后传输myFile.txt大约需要10-12分钟。 myFile.txt不是一个大文件(大约800 KB)。看来Spring FTP API首先执行listFiles()然后过滤掉我的特定文件(可能是我错了)。由于文件FTP很慢,我的代码有什么问题吗?

@Bean
@Lazy(false)
public SessionFactory<FTPFile> ftpSessionFactory() {
    DefaultFtpSessionFactory sf = new DefaultFtpSessionFactory();
    sf.setHost(server);
    sf.setPort(port);
    sf.setUsername(username);
    sf.setPassword(password);
    return new CachingSessionFactory<FTPFile>(sf);
}

@Bean
public FtpInboundFileSynchronizer ftpInboundFileSynchronizer() {
    FtpInboundFileSynchronizer fileSynchronizer = new FtpInboundFileSynchronizer(ftpSessionFactory());

    fileSynchronizer.setDeleteRemoteFiles(false);
    fileSynchronizer.setPreserveTimestamp(true);
    fileSynchronizer.setRemoteDirectory(remoteDirectory);

    fileSynchronizer.setFilter(new FtpSimplePatternFileListFilter("myFile.txt")));
    return fileSynchronizer;
}



@Bean
@InboundChannelAdapter(channel = "ftpChannel", poller = @Poller(fixedDelay = "10000}", maxMessagesPerPoll = "1") )
public MessageSource<File> ftpMessageSource() {
    FtpInboundFileSynchronizingMessageSource source = new FtpInboundFileSynchronizingMessageSource(ftpInboundFileSynchronizer());
    source.setLocalDirectory(new File(localFtpDirectory));
    source.setAutoCreateLocalDirectory(true);
    return source;
}

@Bean
@ServiceActivator(inputChannel = "ftpChannel")
public MessageHandler ftpHandler() {
    return new MessageHandler() {

        @Override
        public void handleMessage(Message<?> message) throws MessagingException {
            LOG.info("File '{}' is ready for reading after FTP", message.getPayload());
        }
    };
}

1 个答案:

答案 0 :(得分:1)

是的,它列出了所有文件;如果你使用出站网关获取你想要的单个文件,你可能会有更好的性能,而不是先将它们全部列出。

请参阅FTP outbound gateway