Cosmos DB 异步客户端:Iterator<FeedResponse<Document>> 它卡在 hasNext() 方法上
CosmosDB Asynch client : Iterator<FeedResponse<Document>> it is getting stuck on hasNext() method
我尝试 运行 跨分区查询的以下代码卡在 it.hasNext() 行。无法在此处进一步调试:
public List<MyDataObject> getList() {
List<Document> documentList =null;
List<MyDataObject> returnList = new ArrayList<>();
try {
FeedOptions feedOptions = new FeedOptions();
feedOptions.setEnableCrossPartitionQuery(true);
SqlQuerySpec querySpec = null;
querySpec = new SqlQuerySpec("SELECT * FROM MyDataObjectColl");
Iterator<FeedResponse<Document>> getDataFromCosmos = myDocumentClient.queryDocuments(collectionLink, querySpec, feedOptions).toBlocking().getIterator();
while (getDataFromCosmos.hasNext()) { //GETTING STUCK ON THIS LINE FOR SOME REASON
FeedResponse<Document> page = getDataFromCosmos.next();
System.out.println("Request Unit Cost for getList " + page.getRequestCharge());
documentList = page.getResults();
for (Document doc : documentList) {
if (doc != null) {
returnList.add(gson.fromJson(doc.toJson(), MyDataObject.class));
}
}
}
} catch (Exception e) {
throw new RuntimeException(e);
}
return returnList;
}
SDK 版本:
<dependency>
<groupId>com.microsoft.azure</groupId>
<artifactId>azure-cosmosdb</artifactId>
<version>2.4.4</version>
</dependency>
嘿,CosmosDB 内部专家请指出可能导致此行为的原因我怀疑缺少某些正在阻塞的库,请帮忙。
怀疑是版本问题导致的,基本上我的应用程序内部库使用的是以下版本的 commons-lang3 :
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.3.1</version>
</dependency>
但是 azure-cosmosdb 2.4.4 需要不同的 :
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.8.1</version>
</dependency>
详细解释:
基本上 cosmosdb 在 class FetchExecutionRangeAccumulator 内部使用一行 this.stopwatch.getTime(TimeUnit.MILLISECONDS)
但 long getTime(final TimeUnit timeUnit)
存在于 3.8.1 版本的 commons-lang3 中,而不是在 3.3.1 中因此,如果重试相同的代码流,它会在内部卡在轮询代码中并间歇性地抛出异常(在 commons-lang3 中找不到该方法)。
我尝试 运行 跨分区查询的以下代码卡在 it.hasNext() 行。无法在此处进一步调试:
public List<MyDataObject> getList() {
List<Document> documentList =null;
List<MyDataObject> returnList = new ArrayList<>();
try {
FeedOptions feedOptions = new FeedOptions();
feedOptions.setEnableCrossPartitionQuery(true);
SqlQuerySpec querySpec = null;
querySpec = new SqlQuerySpec("SELECT * FROM MyDataObjectColl");
Iterator<FeedResponse<Document>> getDataFromCosmos = myDocumentClient.queryDocuments(collectionLink, querySpec, feedOptions).toBlocking().getIterator();
while (getDataFromCosmos.hasNext()) { //GETTING STUCK ON THIS LINE FOR SOME REASON
FeedResponse<Document> page = getDataFromCosmos.next();
System.out.println("Request Unit Cost for getList " + page.getRequestCharge());
documentList = page.getResults();
for (Document doc : documentList) {
if (doc != null) {
returnList.add(gson.fromJson(doc.toJson(), MyDataObject.class));
}
}
}
} catch (Exception e) {
throw new RuntimeException(e);
}
return returnList;
}
SDK 版本:
<dependency>
<groupId>com.microsoft.azure</groupId>
<artifactId>azure-cosmosdb</artifactId>
<version>2.4.4</version>
</dependency>
嘿,CosmosDB 内部专家请指出可能导致此行为的原因我怀疑缺少某些正在阻塞的库,请帮忙。
怀疑是版本问题导致的,基本上我的应用程序内部库使用的是以下版本的 commons-lang3 :
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.3.1</version>
</dependency>
但是 azure-cosmosdb 2.4.4 需要不同的 :
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.8.1</version>
</dependency>
详细解释:
基本上 cosmosdb 在 class FetchExecutionRangeAccumulator 内部使用一行 this.stopwatch.getTime(TimeUnit.MILLISECONDS)
但 long getTime(final TimeUnit timeUnit)
存在于 3.8.1 版本的 commons-lang3 中,而不是在 3.3.1 中因此,如果重试相同的代码流,它会在内部卡在轮询代码中并间歇性地抛出异常(在 commons-lang3 中找不到该方法)。