Слишком много соединений с apache commons-vfs2 - PullRequest
0 голосов
/ 07 ноября 2018

У меня есть приложение для загрузки файлов из 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;
    }

1 Ответ

0 голосов
/ 17 января 2019

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

((DefaultFileSystemManager) fsManager).close();

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

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

...