Слишком много соединений с 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