Beispiel #1
0
  /** 返回结果为已处理成功的记录 */
  public DbLoadContext load(RowBatch rowBatch, WeightController controller, DbLoadContext context) {
    Assert.notNull(rowBatch);
    try {
      List<EventData> datas = rowBatch.getDatas();
      context.setPrepareDatas(datas);
      // 执行重复录入数据过滤
      datas = context.getPrepareDatas();
      if (datas == null || datas.size() == 0) {
        logger.info("##no eventdata for load, return");
        return context;
      }

      // 因为所有的数据在DbBatchLoader已按照DateMediaSource进行归好类,不同数据源介质会有不同的DbLoadAction进行处理
      // 设置media source时,只需要取第一节点的source即可
      interceptor.prepare(context);
      // 执行重复录入数据过滤
      datas = context.getPrepareDatas();
      WeightBuckets<EventData> buckets = buildWeightBuckets(context, datas);
      List<Long> weights = buckets.weights();
      controller.start(weights); // weights可能为空,也得调用start方法
      if (CollectionUtils.isEmpty(datas)) {
        logger.info("##no eventdata for load");
      }
      // 按权重构建数据对象
      // 处理数据
      for (int i = 0; i < weights.size(); i++) {
        Long weight = weights.get(i);
        controller.await(weight.intValue());
        // 处理同一个weight下的数据
        List<EventData> items = buckets.getItems(weight);
        logger.debug("##start load for weight:" + weight);
        // 预处理下数据

        // 进行一次数据合并,合并相同pk的多次I/U/D操作
        items = DbLoadMerger.merge(items);
        // 按I/U/D进行归并处理
        DbLoadData loadData = new DbLoadData();
        doBefore(items, context, loadData);
        // 执行load操作
        doLoad(context, loadData);
        controller.single(weight.intValue());
        logger.debug("##end load for weight:" + weight);
      }
      interceptor.commit(context);
    } catch (InterruptedException e) {
      Thread.currentThread().interrupt();
      interceptor.error(context);
    } catch (Exception e) {
      interceptor.error(context);
      throw new ClaveException(e);
    }

    return context; // 返回处理成功的记录
  }
Beispiel #2
0
  /** 构建基于weight权重分组的item集合列表 */
  private WeightBuckets<EventData> buildWeightBuckets(
      DbLoadContext context, List<EventData> datas) {
    WeightBuckets<EventData> buckets = new WeightBuckets<EventData>();
    for (EventData data : datas) {
      // 获取对应的weight
      // TODO 根据表名定义权重
      buckets.addItem(1, data);
    }

    return buckets;
  }