我有一个过程来管理应用于文件实例系统的文件夹树模板(每个文件夹有数百个文件夹)应用于数百个实例。修改模板后,该过程会将更新应用于每个实例,如果从模板中删除了一个文件夹,则对应的实例文件夹将被更改(所有父文件夹均已删除)并移至全局归档文件夹(已添加归档父文件夹) 。对于每个文件夹,每个链接的文档也会取消链接(该特定的父级将被删除)。
为此,我需要执行几百个列表请求以获取要归档的文件夹的子项(文件),因此为了提高性能,我想移至批处理请求。列表响应将被onSuccess回调拦截,并收集在映射文件ID->子代中。
但是,在FileList(仅包含有关结果的信息)和responseHeaders中,我都没有找到可用于回调方法以将列表结果与相应查询匹配的任何信息。我尝试添加自己的“ content-id”标头,但未在响应中找到它(您需要提供自己的getDriveService方法来构建Drive API客户端):
public void unlinkChildren(Set<String> parentIds) throws Exception {
BatchRequest batch = getDriveService().batch();
// get the children of every parent
FileListCallbackHandler fileListCallback = new FileListCallbackHandler();
for (String parentId : parentIds) {
final String query = String.format("trashed=false and '%s' in parents", parentId);
Drive.Files.List list = getDriveService().files().list().setQ(query);
list.getRequestHeaders().set("content-id", parentId);
list.queue(batch, fileListCallback);
if (batch.size() == 100) {
batch.execute();
}
}
if (batch.size() > 0) {
batch.execute();
}
Map<String, List<File>> childrenMap = fileListCallback.getSearchResultMap();
// do stuff
}
public class FileListCallbackHandler extends JsonBatchCallback<FileList> {
private Map<String, List<File>> searchResultMap = new HashMap<>();
@Override
public void onSuccess(FileList t, HttpHeaders responseHeaders) throws IOException {
String parentId = responseHeaders.getFirstHeaderStringValue("Content-ID"); // this is null >:(
searchResultMap.put(parentId, t.getFiles());
}
@Override
public void onFailure(GoogleJsonError e, HttpHeaders responseHeaders) throws IOException {
logger.error("Error Message: {}", e.getMessage());
}
public Map<String, List<File>> getSearchResultMap() {
return searchResultMap;
}
}
我保护Content-ID标头包含我放置在其中的值,但是响应中没有这样的标头。我只有
{cache-control=[private, max-age=0], content-length=[2024], content-type=[application/json; charset=UTF-8], date=[Mon, 28 Jan 2019 17:42:52 GMT], expires=[Mon, 28 Jan 2019 17:42:52 GMT]}
有什么方法可以使请求和响应之间达到匹配?