深入浅出 jackrabbit 六 文本提取(上)
2009-09-17 00:00:00 来源:WEB开发网方法很简单,就是调用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);
}
Tags:深入浅出 jackrabbit 文本
编辑录入:爽爽 [复制链接] [打 印]更多精彩
赞助商链接