WEB开发网
开发学院软件开发Java 深入浅出 jackrabbit 六 文本提取(上) 阅读

深入浅出 jackrabbit 六 文本提取(上)

 2009-09-17 00:00:00 来源:WEB开发网   
核心提示: 方法很简单,就是调用reader的读取,深入浅出 jackrabbit 六 文本提取(上)(6),只是它调用的是Reader类的read()方法:Java代码publicintread(charcbuf[])throwsIOException{returnread(cbuf,0,cbuf.len

方法很简单,就是调用reader的读取,只是它调用的是Reader类的read()方法:

Java代码   

public int read(char cbuf[]) throws IOException { 
  return read(cbuf, 0, cbuf.length); 
  } 
而其实目标的方法是子类的read(cbuf, 0, cbuf.length);也就是说应该是TextExtractorReader# read(cbuf, 0, cbuf.length),那么我们来看一下这个方法TextExtractorReader# read:这个read方法才是真正为LazyTextExtractorField#stringValue返回数据的地方 
  public int read(char cbuf[], int off, int len) throws IOException { 
/*事实上,这里的extractedText应该是不会等于空的,因为如果是异步提取,那么在lucene调用read方法之前,extract线程早就把extractedText提取出来,或者将其置为new StringReader(“”)了,除非一个document在isExtractorFinished返回false的时候,也被加入了 indexwriter。在正常流程的debug过程中,ahuaxuan并没有发现程序执行到这个if块里面*/ 
 
    if (extractedText == null) { 
      // no reader present 
      // check if job is started already 
      if (jobStarted) { 
        // wait until available 
/*如果任务已经开始,那么等待读取文本,那么如果任务开始,这个开始是谁开始的呢?其实就是后面要讲到的第二种触发方式,这里是无限时等待,太恐怖了,所以这个代码段是存在危险的,实际上,如果我们如果在每个单独的Extractor类中设置专门的超时时间,那么这里就没有问题了。*/ 
        extractedText = job.getReader(Long.MAX_VALUE); 
      } else { 
        // execute with current thread 
/*如果提取任务还没有被触发,则把该线程实例放到DIRECT_EXECUTOR这个线程池中运行,注意,其实这个类很诡异,它并不是一个线程池,它拿到线程对象之后会调用run方法,而不是start,这也意味着这个操作是非异步的,这里不会有多线程的问题 */ 
        try { 
          DIRECT_EXECUTOR.execute(job); 
        } catch (InterruptedException e) { 
          // current thread is in interrupted state 
          // -> ignore (job will not return a reader, which is fine) 
        } 
/*同步执行,立即取结果,取不到就返回null*/ 
        extractedText = job.getReader(0); 
      } 
 
      if (extractedText == null) { 
        // exception occurred 
        extractedText = new StringReader(""); 
      } 
    } 
    return extractedText.read(cbuf, off, len); 
  }

上一页  1 2 3 4 5 6 7 8  下一页

Tags:深入浅出 jackrabbit 文本

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接