createContainerIfNotExists 时出现宇宙数据库错误

时间:2021-06-25 14:37:11

标签: java azure azure-cosmosdb

我正在使用 azure cosmos db,突然间,它停止工作,出现以下错误

调用的方法:

cosmosDatabase.createContainerIfNotExists(containerProperties);

java.lang.IllegalStateException: block()/blockFirst()/blockLast() are blocking, which is not supported in thread parallel-10
at reactor.core.publisher.BlockingSingleSubscriber.blockingGet(BlockingSingleSubscriber.java:83) ~[reactor-core-3.4.5.jar:3.4.5]
at reactor.core.publisher.Mono.block(Mono.java:1703) ~[reactor-core-3.4.5.jar:3.4.5]
at com.azure.cosmos.CosmosDatabase.blockContainerResponse(CosmosDatabase.java:288) ~[azure-cosmos-4.14.0.jar:na]
at com.azure.cosmos.CosmosDatabase.createContainerIfNotExists(CosmosDatabase.java:195) ~[azure-cosmos-4.14.0.jar:na] 

方法调用 save()

java.lang.IllegalStateException: block()/blockFirst()/blockLast() are blocking, which is not supported in thread parallel-12
at reactor.core.publisher.BlockingSingleSubscriber.blockingGet(BlockingSingleSubscriber.java:83) ~[reactor-core-3.4.5.jar:3.4.5]
at reactor.core.publisher.Mono.block(Mono.java:1703) ~[reactor-core-3.4.5.jar:3.4.5]
at com.azure.cosmos.CosmosContainer.blockItemResponse(CosmosContainer.java:235) ~[azure-cosmos-4.14.0.jar:na]
at com.azure.cosmos.CosmosContainer.createItem(CosmosContainer.java:156) ~[azure-cosmos-4.14.0.jar:na]
at com.lendico.archive.repository.cosmos.CosmosRepositoryImpl.save(CosmosRepositoryImpl.java:33) ~[classes/:

请注意,我没有使用异步数据库。

更多的上下文:

它正在一个流中处理,在那里我得到一个 Flux 对象并对其进行交互,

        <dependency>
            <groupId>com.azure.spring</groupId>
            <artifactId>azure-spring-boot-starter-cosmos</artifactId>
            <version>3.4.0</version>
        </dependency>

反应控制器调用波纹管方法。 P.S 请注意,我更改了与业务相关的名称。

服务类:

    public Mono<ResponseObect> myMethod(final RequestObject request) {
        return getSomeFlux(request).flatMap(someObject -> {
                   RepositoryClass.save(someObject);
                    return Flux.just(someObject);
                }
        ).count().map(ResponseObect::new);

    }

回购类:

public void save(final MyObject newItem, final String containerName) {
    CosmosContainer container = getContainer(containerName);
    CosmosItemResponse<MyObject> savedItem = container.createItem(newItem);

    if (savedItem.getStatusCode() != 201) {
                do logging
    }
}

private CosmosContainer getContainer(final String containerName) {
    CosmosUtils.createContainerIfNotExists(containerName, cosmosDatabase);
    return cosmosDatabase.getContainer(containerName);
}

1 个答案:

答案 0 :(得分:0)

深入研究 Cosmos db api,它使用块,即使我没有使用异步数据库。 当我选择无异步客户端、数据库、容器时,我不喜欢使用反应式方法的想法...... 但是我所做的解决了这个问题的是用异步对象替换了我的对象。

但是发生了一些奇怪的行为,我的消费者(我传递给 subscribe(consumer) 的那个)只有在容器已经存在时才会被执行,否则,即使正在创建容器也不会执行。

 cosmosContainerResponseMono.subscribe(containerResponse -> {
            if (containerResponse.getStatusCode() == 200) {
                log.info("Container created: [{}] ", containerName);
                containerCreated.set(true);
            }
        });

而且我也很奇怪为什么它之前可以工作而突然间停止了