我尝试使用批处理操作在Cosmo DB中存储多种类型的记录。但是我在CosmoBatchResponse对象中得到400状态,并且errorMessage为null。在内部,一个项目给出400,所有其他操作都有424状态码(失败的依赖关系)。从这个[文档] https://learn.microsoft.com/en-us/rest/api/cosmos-db/http-status-codes-for-cosmosdb我可以看到可能有很多400的原因,但如果errorMessage为null,那么如何找到出错的原因。此外,通过创建调用存储相同的消息,仅在批量保存时面临问题。
PartitionKey partitionKey = new PartitionKey("customerNo");
CosmosBatch batch = CosmosBatch.createCosmosBatch(partitionKey);
batch.createItemOperation(customer);
我已经尝试通过创建方法只在CosmosItemOperation上循环存储,并且它正在存储。
CosmosBatchResponse response=paymentRepository.createBatch(cosmosBatch);
for(CosmosItemOperation itemOp:cosmosBatch.getOperations()) {
System.out.println(paymentRepository.create(itemOp.getItem(),""));// Here it is getting stored.
}
public CosmosBatchResponse createBatch(CosmosBatch cosmosBatch) {
CosmosBatchResponse response = null;
try {
response = container.executeCosmosBatch(cosmosBatch);
System.out.println(response.isSuccessStatusCode()); -- returns false
System.out.println(response.getErrorMessage()); -- returns null
return response;
} catch (final Exception e) {
int statusCode = CosmosUtils.getCosmosStatusCode(e);
if (CONFLICT_RESOURCE == statusCode) {
log.error(
"CosmosCreateDocumentException: Resource already exists for Document : {}",
response.getErrorMessage());
}
shouldRetryOnException(e);
log.error(
"CosmosCreateDocumentException for Document {} - {}, {}", cosmosBatch, e.getMessage(), e);
throw new GenericRepositoryException(e.getMessage(), e);
}
}
1条答案
按热度按时间2jcobegt1#
我遇到了完全相同的问题,cosmos createItemOperation与存储过程一起工作,但在编写完全相同的项目集时,cosmos batch失败。Cosmos批处理返回400,subStatus代码为0,错误消息为空。
在我的例子中,我发现cosmos批处理只有在项目级别设置有效的“ttl”值时才能工作,而存储过程不需要在项目级别设置“ttl”,无论“ttl”在容器级别如何配置。
我没有找到任何文档说明cosmos批处理操作需要“ttl”,除了上面提到的变通方法之外,我还没有找到实际的解决方案,在这篇文章中寻找更多的更新。