zoukankan      html  css  js  c++  java
  • solr dataimport 数据导入源码分析(四)

    我们查看DocBuilder类的源码发现,并不是直接持有对SqlEntityProcessor类的引用,而是另外一个包装类EntityProcessorWrapper,EntityProcessorWrapper直接继承自抽象类EntityProcessor,而不是继承自中间的EntityProcessorBase类,简要类图如下

     包装类额外添加了缓存处理以及格式转换等功能,然后调用SqlEntityProcessor相应方法进行处理,相当于SqlEntityProcessor的代理类,共同继承自抽象类EntityProcessor(SqlEntityProcessor 是通过EntityProcessorBase 间接继承自EntityProcessor)

     EntityProcessorWrapper类的简要代码如下

    public class EntityProcessorWrapper extends EntityProcessor {
      private static final Logger log = LoggerFactory.getLogger(EntityProcessorWrapper.class);

      EntityProcessor delegate;
      private DocBuilder docBuilder;

      String onError;
      Context context;
      protected VariableResolverImpl resolver;
      String entityName;

      protected List<Transformer> transformers;

      protected List<Map<String, Object>> rowcache;

      public EntityProcessorWrapper(EntityProcessor delegate, DocBuilder docBuilder) {
        this.delegate = delegate;
        this.docBuilder = docBuilder;
      }

      @Override
      public void init(Context context) {

        delegate.init(context);

      }
      
      protected Map<String, Object> getFromRowCache() {
        if (rowcache.isEmpty()){
          return null;
        }
        return rowcache.remove(0);
      }

      @Override
      public Map<String, Object> nextRow() {
        pullRow();
      }
      

      protected Map<String,Object> pullRow() {
        Map<String,Object> arow = null;
        try {
          arow = delegate.nextRow();
        } catch (Exception e) {
          if (ABORT.equals(onError)) {
            wrapAndThrow(SEVERE, e);
          } else {
            // SKIP is not really possible. If this calls the nextRow() again the
            
    // Entityprocessor would be in an inconistent state
            log.error("Exception in entity : " + entityName, e);
            return null;
          }
        }
        log.debug("arow : {}", arow);
        return arow;
      }

      @Override
      public Map<String, Object> nextModifiedRowKey() {
        Map<String, Object> row = delegate.nextModifiedRowKey();
        row = applyTransformer(row);
        rowcache = null;
        return row;
      }

      @Override
      public Map<String, Object> nextDeletedRowKey() {
        Map<String, Object> row = delegate.nextDeletedRowKey();
        row = applyTransformer(row);
        rowcache = null;
        return row;
      }

      @Override
      public Map<String, Object> nextModifiedParentRowKey() {
        return delegate.nextModifiedParentRowKey();
      }

      @Override
      public void destroy() {
        delegate.destroy();
      }
      

      @Override
      public void close() {
        delegate.close();
      }

  • 相关阅读:
    Linux常用命令及详细说明 — 结合工作(侧重性能监控,包括CPU、内存、IO、网络、磁盘等)
    navicat连接不上Linux服务器上的mysql的解决办法
    Git之rebase、merge和cherry pick的区别详解—面试常问
    阿里《JAVA实习生入职测试题—2019最新》之答案详解(连载一)
    技术语言框架学习方法论
    阿里《JAVA实习生入职测试题—2019最新》之答案详解(连载二)
    C# 文件/文件夹一般操作(File、Directory)
    Log4Net 使用及组合公共类
    VmWare 15 设置Centos7 共享文件夹及问题记录
    Centos 7 使用(Service iptables stop/start)关闭/打开防火墙 Failed to stop iptables.service: Unit iptables.service not loaded.
  • 原文地址:https://www.cnblogs.com/chenying99/p/2677764.html
Copyright © 2011-2022 走看看