azure 在cosmo DB批处理操作中获取400作为状态码

g9icjywg  于 2023-06-24  发布在  其他
关注(0)|答案(1)|浏览(101)

我尝试使用批处理操作在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);
}

}

2jcobegt

2jcobegt1#

我遇到了完全相同的问题,cosmos createItemOperation与存储过程一起工作,但在编写完全相同的项目集时,cosmos batch失败。Cosmos批处理返回400,subStatus代码为0,错误消息为空。
在我的例子中,我发现cosmos批处理只有在项目级别设置有效的“ttl”值时才能工作,而存储过程不需要在项目级别设置“ttl”,无论“ttl”在容器级别如何配置。
我没有找到任何文档说明cosmos批处理操作需要“ttl”,除了上面提到的变通方法之外,我还没有找到实际的解决方案,在这篇文章中寻找更多的更新。

相关问题