1.5.7 允许部分执行的批量操作

优质
小牛编辑
126浏览
2023-12-01

BatchResult partialAllowedBatch(BatchRequest request)

功能

一般的batch请求,当表quota不足时会全部拒绝;而partialAllowedBatch允许在quota满足的范围内,部分记录可以执行, 通过返回值告知用户哪些记录执行成功,哪些记录没有执行, 若当前quota不满足甚至1条记录执行,会抛出THROUGHPUT_EXCEED异常; 用户需要检查返回值,把没有执行的记录循环地发请求,直到所有记录都成功执行为止。

方法参数

request : BatchRequest : required

BatchRequest 包括一个可以为PutRequest, RemoveRequest, GetRequest, IncrementRequest的列表

1.items : List< BatchRequestItem > : required

BatchRequestItem包括BatchOp和Request

枚举类型BatchOp(PUT, GET, REMOVE, INCREMENT)指定该request的操作类型,

相应的,使用putRequest,getRequest, removeRequest,incrementRequest构造Request参数

方法返回值

batchResult : BatchResult

BatchResult 包括一个带有BatchResultItem的列表,表示batch的每个请求的执行结果

items : List< BatchResultItem >

返回每个子操作的结果,其中isSuccess==true表示已经执行,isSuccess==false表示没有执行

限制

每个子操作必须是同一个表的

put,remove请求不支持带条件

batch操作的子操作数范围为[ 1, 100 ]

示例

下面示例代码

List<BatchRequestItem> batch = new ArrayList<BatchRequestItem>();
  for (int i = 11; i < 20; i++) {
    BatchRequestItem item = new BatchRequestItem().setAction(BatchOp.PUT);
    Map<String, Datum> record = new HashMap<String, Datum>();
    record.put("cityId", DatumUtil.toDatum(cities[i]));
    putRequest.putToRecord("timestamp", DatumUtil.toDatum(now.getTime()));
    putRequest.putToRecord("score", DatumUtil.toDatum((double) new Random().nextInt(100)));
    putRequest.putToRecord("pm25", DatumUtil.toDatum((long) (new Random().nextInt(500))));
    item.setRequest(Request.putRequest(new PutRequest().setTableName(tableName).setRecord(record)));
    batch.add(item);
  }

  while (true) {
    BatchResult br = tableClient.partialAllowedBatch(new BatchRequest().setItems(batch));
    List<BatchRequestItem> request = new ArrayList<BatchRequestItem>();
    for (int i = 0; i < br.getItems().size(); i++) {
    //At current only quota exceeded will get  isSuccess() == false
      if (!br.getItems().get(i).isSuccess()) {
        request.add(batch.get(i));
      }
    }
    if (request.isEmpty()) {
      break;
    }
    Thread.sleep(100); // wait a while to retry.
    batch = request;
  }