Слишком много соединений с apache commons-vfs2

У меня есть приложение для загрузки файлов из sftp. Я в настоящее время использую apache commons-vfs2

У меня есть планировщик, который запускается каждые 1 минуту. 1. Получите список файлов, которые находятся на удаленном компьютере (откройте соединение, получите список, затем закройте соединение) 2. Загрузите файлы с шага 1 (откройте соединение, загрузите все файлы, затем закройте соединение)

Как я могу сохранить подключения к минимуму? Есть ли способ ограничить количество соединений с commons-vfs2?

Вот мой код

private List<FileObject> getRemoteFilesList() throws FileSystemException {
        FileObject[] remoteFiles;
        try {
            manager.init();
            final @Cleanup FileObject remoteDirectoryObject = manager.resolveFile(uri, fileSystemOptions);
            remoteFiles = remoteDirectoryObject.getChildren();

        } finally {
            manager.freeUnusedResources();
            manager.close();
        }
        return Arrays.stream(remoteFiles)
                     .collect(Collectors.toList());
    }

private List<File> downloadRemoteFiles(final List<FileObject> remoteFiles) {
        if(remoteFiles.isEmpty()) {
            return Collections.emptyList();
        }

        final List<File> myCollection = new ArrayList<>();
        try {
            manager.init();

            for (final FileObject myfile : remoteFiles) {
                final File localFile = downloadFile(myfile);
                myCollection.add(localFile);
                myfile.delete();
            }
        } catch (final IOException exception) {
            log.warn("Unable to download because ", exception);
        } finally {
            manager.freeUnusedResources();
            manager.close();
        }
        return myCollection;
    }

0 ответов

Apache commons wiki для VFS ( https://wiki.apache.org/commons/VfsFaq) говорит, что при определенных обстоятельствах при закрытии соединения SFTP следует использовать следующее:

((DefaultFileSystemManager) fsManager).close();

Это заставляет close метод на DefaultFileSystemManager называться, а не close метод на FileSystemManager учебный класс.

Возможно, это не ваша проблема, но это может быть связано.

Вы можете попробовать этот альтернативный метод, чтобы очистить все временные файлы и закрыть всех поставщиков.

FileObject src = null;

/**
 * Release system resources, close connection to the filesystem. 
 */
public void release() {
    FileSystem fs = null;

    this.src.close(); // Seems to still work even if this line is omitted
    fs = this.src.getFileSystem(); // This works even after the src is closed.
    this.fsManager.closeFileSystem(fs);
}

Более подробную информацию можно найти на сайте: https://cwiki.apache.org/confluence/display/COMMONS/SimpleSftpFileDownload

Другие вопросы по тегам