我正在使用 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);
}
答案 0 :(得分:0)
深入研究 Cosmos db api,它使用块,即使我没有使用异步数据库。 当我选择无异步客户端、数据库、容器时,我不喜欢使用反应式方法的想法...... 但是我所做的解决了这个问题的是用异步对象替换了我的对象。
但是发生了一些奇怪的行为,我的消费者(我传递给 subscribe(consumer)
的那个)只有在容器已经存在时才会被执行,否则,即使正在创建容器也不会执行。
cosmosContainerResponseMono.subscribe(containerResponse -> {
if (containerResponse.getStatusCode() == 200) {
log.info("Container created: [{}] ", containerName);
containerCreated.set(true);
}
});
而且我也很奇怪为什么它之前可以工作而突然间停止了