企业搜索引擎开发之连接器connector(二十四)
本人在上文中提到,连接器实现了两种事件依赖的机制 ,其一是我们手动操作连接器实例时;其二是由连接器的自动更新机制
上文中分析了连接器的自动更新机制,即定时器执行定时任务
那么,如果我们手动操作连接器实例时,是怎么发出事件更新连接器实例的呢
通过eclipse开发工具,追踪调用ChangeDetector接口的detect()方法的方法

ChangeDetectorTask类的run方法里面调用我们再上文中已经分析了,其他方法便是ConnectorCoordinatorImpl实例对象的方法
即ConnectorCoordinatorImpl实例对象的如下方法,分别调用了ChangeDetector接口的detect()方法
/**
* 移除连接器实例
* Removes this {@link Connector} instance. Halts traversals,
* removes the Connector instance from the known connectors,
* and removes the Connector's on-disk representation.
*/
/* @Override */
public void removeConnector() {
synchronized(this) {
resetBatch();
if (instanceInfo != null) {
instanceInfo.removeConnector();
}
}
// This must not be called while holding the lock.
changeDetector.detect();
} /**
* 重启遍历
* Retraverses the {@link Connector}'s content from scratch.
* Halts any traversal in progress and removes any saved traversal state,
* forcing the Connector to retraverse the Repository from its start.
*/
/* @Override */
public void restartConnectorTraversal() throws ConnectorNotFoundException {
// To avoid deadlock, this method calls InstanceInfo's getters and setters,
// rather than the local ones.
synchronized(this) {
resetBatch(); // Halt any traversal.
getInstanceInfo().setConnectorState(null); // Discard the checkpoint. // If Schedule was 'run-once', re-enable it to run again. But watch out -
// empty disabled Schedules could look a bit like a run-once Schedule.
Schedule schedule = getInstanceInfo().getConnectorSchedule();
if (schedule != null && schedule.isDisabled() &&
schedule.getRetryDelayMillis() == -1 &&
schedule.nextScheduledInterval() != -1) {
schedule.setDisabled(false);
getInstanceInfo().setConnectorSchedule(schedule);
}
} // TODO: Remove this if we switch completely to JDBC PersistentStore.
// FileStore doesn't notice the deletion of a file that did not exist.
if (lister != null) {
connectorCheckpointChanged(null);
} // This must not be called while holding the lock.
changeDetector.detect();
} /**
* 设置配置信息
* Sets the {@link Configuration} for this {@link ConnectorCoordinator}.
* If this {@link ConnectorCoordinator} supports persistence this will
* persist the new Configuration.
*/
/* @Override */
public ConfigureResponse setConnectorConfiguration(TypeInfo newTypeInfo,
Configuration configuration, Locale locale, boolean update)
throws ConnectorNotFoundException, ConnectorExistsException,
InstantiatorException {
LOGGER.info("Configuring connector " + name);
String typeName = newTypeInfo.getConnectorTypeName();
Preconditions.checkArgument(typeName.equals(configuration.getTypeName()),
"TypeInfo must match Configuration type");
ConfigureResponse response = null;
synchronized(this) {
resetBatch();
if (instanceInfo != null) {
if (!update) {
throw new ConnectorExistsException();
}
if (typeName.equals(typeInfo.getConnectorTypeName())) {
configuration =
new Configuration(configuration, getConnectorConfiguration());
response = resetConfig(instanceInfo.getConnectorDir(), typeInfo,
configuration, locale);
} else {
// An existing connector is being given a new type - drop then add.
// TODO: This shouldn't be called from within the synchronized block
// because it will kick the change detector.
removeConnector();
response = createNewConnector(newTypeInfo, configuration, locale);
if (response != null) {
// TODO: We need to restore original Connector config. This is
// necessary once we allow update a Connector with new ConnectorType.
// However, when doing so consider: createNewConnector could have
// thrown InstantiatorException as well. Also, you need to kick
// the changeDetector (but not in this synchronized block).
LOGGER.severe("Failed to update Connector configuration.");
// + " Restoring original Connector configuration.");
}
}
} else {
if (update) {
throw new ConnectorNotFoundException();
}
response = createNewConnector(newTypeInfo, configuration, locale);
}
}
if (response == null) {
// This must not be called while holding the lock.
changeDetector.detect();
} else {
return new ExtendedConfigureResponse(response, configuration.getXml());
}
return response;
} /**
* 设置定时调度
* Sets the traversal {@link Schedule} for the {@link Connector}.
*
* @param connectorSchedule Schedule to store or null to unset any existing
* Schedule.
* @throws ConnectorNotFoundException if the connector is not found
*/
/* @Override */
public void setConnectorSchedule(Schedule connectorSchedule)
throws ConnectorNotFoundException {
synchronized(this) {
// Persistently store the new schedule.
getInstanceInfo().setConnectorSchedule(connectorSchedule);
}
// This must not be called while holding the lock.
changeDetector.detect();
}
接下来ChangeDetector接口的detect()方法其实又调用了自身的实现ConnectorCoordinatorImpl实例对象的实现ChangeHandler接口的方法
ConnectorCoordinatorImpl-->ChangeDetector的detect()-->ChangeListener的相关方法-->ChangeHandler(ConnectorCoordinatorImpl实例对象)的相关方法
所以手动操作与自动更新机制实际上是殊途同归,最后都是调用了ChangeHandler(ConnectorCoordinatorImpl实例对象)的相关方法
---------------------------------------------------------------------------
本系列企业搜索引擎开发之连接器connector系本人原创
转载请注明出处 博客园 刺猬的温驯
本人邮箱: chenying998179@163#com (#改为.)
本文链接 http://www.cnblogs.com/chenying99/p/3776515.html
企业搜索引擎开发之连接器connector(二十四)的更多相关文章
- 企业搜索引擎开发之连接器connector(十九)
连接器是基于http协议通过推模式(push)向数据接收服务端推送数据,即xmlfeed格式数据(xml格式),其发送数据接口命名为Pusher Pusher接口定义了与发送数据相关的方法 publi ...
- 企业搜索引擎开发之连接器connector(十八)
创建并启动连接器实例之后,连接器就会基于Http协议向指定的数据接收服务器发送xmlfeed格式数据,我们可以通过配置http代理服务器抓取当前基于http协议格式的数据(或者也可以通过其他网络抓包工 ...
- 企业搜索引擎开发之连接器connector(十六)
本人有一段时间没有接触企业搜索引擎之连接器的开发了,连接器是涉及企业搜索引擎一个重要的组件,在数据源与企业搜索引擎中间起一个桥梁的作用,类似于数据库之JDBC,通过连接器将不同数据源的数据适配到企业搜 ...
- 企业搜索引擎开发之连接器connector(二十九)
在哪里调用监控器管理对象snapshotRepositoryMonitorManager的start方法及stop方法,然后又在哪里调用CheckpointAndChangeQueue对象的resum ...
- 企业搜索引擎开发之连接器connector(二十八)
通常一个SnapshotRepository仓库对象对应一个DocumentSnapshotRepositoryMonitor监视器对象,同时也对应一个快照存储器对象,它们的关联是通过监视器管理对象D ...
- 企业搜索引擎开发之连接器connector(二十六)
连接器通过监视器对象DocumentSnapshotRepositoryMonitor从上文提到的仓库对象SnapshotRepository(数据库仓库为DBSnapshotRepository)中 ...
- 企业搜索引擎开发之连接器connector(二十五)
下面开始具体分析连接器是怎么与连接器实例交互的,这里主要是分析连接器怎么从连接器实例获取数据的(前面文章有涉及基于http协议与连接器的xml格式的交互,连接器对连接器实例的设置都是通过配置文件操作的 ...
- 企业搜索引擎开发之连接器connector(二十二)
下面来分析线程执行类,线程池ThreadPool类 对该类的理解需要对java的线程池比较熟悉 该类引用了一个内部类 /** * The lazily constructed LazyThreadPo ...
- 企业搜索引擎开发之连接器connector(二十)
连接器里面衔接数据源与数据推送对象的是QueryTraverser类对象,该类实现了Traverser接口 /** * Interface presented by a Traverser. Used ...
随机推荐
- XP IE8 安装失败
装完XP后,此时是IE6.装了QQ浏览器,提示会锁定浏览器主页,没怎么在意. 然后装IE8时,提示失败. 在网上搜索了下是其它浏览器或程序锁定了浏览器主页.卸载QQ浏览器后,成功安装IE8.
- 内核程序开发 LED灯顺序点亮、顺序熄灭
根据实际考试情况,你要按顺序这么来干. 首先,把老师给的文件1.LED灯顺序点亮.顺序熄灭导入到虚拟机里你喜欢的目录下 进入此目录1.LED灯顺序点亮.顺序熄灭: 看到这三个文件,依次打开背过,老师出 ...
- Ubuntu下VIM使用指南
基本命令: Esc:VIM中的万能功能键之一,基本上任何时候按这个键,都可以返回VIM的普通状态. i:在普通状态下按i可以进入“插入”编辑状态,这个时候按方向键移动光标,在想要输入的地方输入字符,用 ...
- Keras Sequential顺序模型
keras是基于tensorflow封装的的高级API,Keras的优点是可以快速的开发实验,它能够以TensorFlow, CNTK, 或者 Theano 作为后端运行. 模型构建 最简单的模型是 ...
- java中路径中参数值是中文,打印到页面是乱码的解决方案
jsp代码: <% String name=request.getParameter("name"); String age=request.getParameter(&qu ...
- 点赞功能实现 $(tag).css('属性', '样式')
1. 创建标签 document.createElement() 2.$(tag).css('属性', 样式) 赋予标签属性样式 3.设置定时器 改变位置 大小 <!DOCTYPE html&g ...
- CImage 往Picture Control贴图 图像显示不正常
在使用CImage 往vc控件 picture Control 上贴图的时候图像显示不太正常如图: 已知原始图片的宽高为640*640 而我上面picture Control 控件宽高小于原始图像 ...
- FM模型
[ 闲聊DNN CTR预估模型] http://www.mamicode.com/info-detail-1465813.html http://blog.csdn.net/bitcarmanlee/ ...
- IT项目经理岗位职责(转)
一. 项目经理岗位职责 1. 项目经理为整个项目的第一责任人. 2. 项目经理对<质量检查报告>中的所有细则负首要责任. 3. 项目经理必须有效掌控项目开发的各个环节,协助.指导项 ...
- Solr Dismax查询解析器-深入分析
Solr 支持多种查询解析,给搜索引擎开发人员提供灵活的查询解析.Solr 中主要包含这几个查询解析器:标准查询解析器.DisMax 查询解析器,扩展 DisMax 查询解析器(eDisMax) Di ...