String LOCK_FILE = "write.lock";
String dicHome = p
.getProperty("paoding.dic.home.absolute.path");
FSLockFactory FileLockFactory = new NativeFSLockFactory(
dicHome);
Lock lock = FileLockFactory.makeLock(LOCK_FILE);
boolean obtained = false;
try {
obtained = lock.obtain(90000);
if (obtained) {
// 编译词典-对词典进行可能的处理,以符合分词器的要求
if (compiler.shouldCompile(p)) {
Dictionaries dictionaries = readUnCompiledDictionaries(p);
Paoding tempPaoding = createPaodingWithKnives(p);
setDictionaries(tempPaoding, dictionaries);
compiler.compile(dictionaries, tempPaoding, p);
}
// 使用编译后的词典
final Dictionaries dictionaries = compiler
.readCompliedDictionaries(p);
setDictionaries(finalPaoding, dictionaries);
// 启动字典动态转载/卸载检测器
// 侦测时间间隔(秒)。默认为60秒。如果设置为0或负数则表示不需要进行检测
String intervalStr = getProperty(p,
Constants.DIC_DETECTOR_INTERVAL);
int interval = Integer.parseInt(intervalStr);
if (interval > 0) {
dictionaries.startDetecting(interval,
new DifferenceListener() {
public void on(Difference diff)
throws Exception {
dictionaries.stopDetecting();
// 此处调用run方法,以当检测到**编译后**的词典变更/删除/增加时,
// 重新编译源词典、重新创建并启动dictionaries自检测
run();
}
});
}
}
} catch (LockObtainFailedException ex) {
log.error("Obtain " + LOCK_FILE + " in " + dicHome
+ " failed:" + ex.getMessage());
throw ex;
} catch (IOException ex) {
log.error("Obtain " + LOCK_FILE + " in " + dicHome
+ " failed:" + ex.getMessage());
throw ex;
} finally {
if (obtained) {
try {
lock.release();
} catch (Exception ex) {
}
}
}