首页 > 解决方案 > CosmosDB 异步客户端:迭代器> 它卡在 hasNext() 方法上

问题描述

我尝试运行跨分区查询的以下代码卡在 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;
}

开发工具包版本:

    <dependency>
        <groupId>com.microsoft.azure</groupId>
        <artifactId>azure-cosmosdb</artifactId>
        <version>2.4.4</version>
    </dependency>

嘿,CosmosDB 内部专家请指出可能导致此行为的原因,我怀疑某些库丢失而导致阻塞,请帮忙。

标签: javaazure-cosmosdbazure-cosmosdb-sqlapi

解决方案


怀疑是版本问题导致了这种情况,基本上我的应用程序内部库正在使用以下版本的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 在FetchExecutionRangeAccumulator类内部使用一行this.stopwatch.getTime(TimeUnit.MILLISECONDS),但long getTime(final TimeUnit timeUnit)存在于 3.8.1 版本的 commons-lang3 而不是 3.3.1 中,因为它在内部陷入轮询代码并间歇性抛出异常(在commons-lang3) 如果重试相同的代码流。


推荐阅读