使用Dropbox Java SDK获取文件夹数据及创建文件夹遇阻塞问题
问题详情
我正在开发一款向Dropbox上传文件的应用,目前在处理Dropbox内的文件/文件夹时遇到阻塞问题。参考Dropbox Java SDK教程编写了获取文件夹数据及创建新文件夹的方法,但该方法无法正常运行。能够成功获取账户信息,但尝试获取文件夹数据时程序发生阻塞,且已在Dropbox应用设置中开启所有文件权限。
代码实现
private void createFolder() throws DbxException { log.info("start createFolder"); FullAccount userData = clientV2.users().getCurrentAccount(); log.info("userData {}", userData.getName()); ListFolderResult folderList = clientV2.files().listFolder(""); log.info("fullFolderList data {}", folderList); while (true){ for(Metadata metadata: folderList.getEntries()){ log.info("folderData: {}", metadata.getPathLower()); } if(!folderList.getHasMore()) { break; } folderList = clientV2.files().listFolderContinue(folderList.getCursor()); } CreateFolderResult resp = clientV2.files().createFolderV2("/testovaciSlozka"); log.info("createFolder: {}", resp); }
日志输出
2024-05-02T14:45:50.064+02:00 INFO 23828 --- [mail] [Mail-EventQueue] com.example.mail.component.Monitor : start createFolder
2024-05-02T14:45:50.713+02:00 INFO 23828 --- [mail] [Mail-EventQueue] com.example.mail.component.Monitor : userData {"given_name":"Miloslav","surname":"Lejček","familiar_name":"Miloslav","display_name":"Miloslav Lejček","abbreviated_name":"ML"}
解决方案
改用异步客户端
同步客户端在单线程事件队列(如日志中的Mail-EventQueue)中运行易引发阻塞,建议切换为异步客户端处理请求:DbxRequestConfig config = DbxRequestConfig.newBuilder("your-app-name").build(); DbxClientV2Async client = new DbxClientV2Async(config, "your-access-token"); // 通过CompletableFuture处理异步结果 client.files().listFolder("") .thenAccept(folderList -> { // 遍历文件夹条目逻辑 while (true) { for(Metadata metadata : folderList.getEntries()) { log.info("folderData: {}", metadata.getPathLower()); } if (!folderList.getHasMore()) break; client.files().listFolderContinue(folderList.getCursor()) .thenAccept(nextFolderList -> folderList = nextFolderList); } }) .exceptionally(e -> { log.error("获取文件夹列表失败", e); return null; });添加请求超时限制
若坚持使用同步客户端,初始化时设置HTTP请求超时,避免无限等待:DbxRequestConfig config = DbxRequestConfig.newBuilder("your-app-name") .withHttpRequestTimeout(Duration.ofSeconds(30)) .build(); DbxClientV2 client = new DbxClientV2(config, "your-access-token");隔离API调用线程
将Dropbox操作放到独立线程池执行,避免阻塞原事件队列:ExecutorService dropboxExecutor = Executors.newFixedThreadPool(2); dropboxExecutor.submit(() -> { try { createFolder(); } catch (DbxException e) { log.error("Dropbox操作异常", e); } });排查网络环境
确认应用运行环境可正常访问Dropbox API,无代理拦截或防火墙限制,可直接测试API端点的连通性排除网络问题。
内容的提问来源于stack exchange,提问作者Milousel

