企业搜索引擎开发之连接器connector(十六)
本人有一段时间没有接触企业搜索引擎之连接器的开发了,连接器是涉及企业搜索引擎一个重要的组件,在数据源与企业搜索引擎中间起一个桥梁的作用,类似于数据库之JDBC,通过连接器将不同数据源的数据适配到企业搜索引擎系统
本文将描述怎样构建连接器应用实例,并开发一个简单的客户端进行测试
我们先用myeclipse建立一个web应用,命名为connector-manager,并添加相关依赖,包括连接器的相关jar依赖
本人当前引入http连接器和db连接器,还可以包括更多的连接器类型,比如数据仓库、共享文件系统、企业邮件等
pom.xml文件如下:
<dependencies>
<dependency>
<groupId>com.google.enterprise.connector</groupId>
<artifactId>connector</artifactId>
<version>3.0.8</version>
</dependency> <dependency>
<groupId>com.google.enterprise.connector</groupId>
<artifactId>connector-http</artifactId>
<version>2.0M3</version>
</dependency>
<dependency>
<groupId>com.google.enterprise.connector</groupId>
<artifactId>connector-db</artifactId>
<version>3.0.0</version>
</dependency>
</dependencies>
然后在myeclipse里面将该web应用编译并添加到tomcat服务器,运行tomcat
我们这时在浏览器打开http://localhost:8080/connector-manager/就可以看到如下显示:
连接器提供了一系列的servlet供客户端以编程方式调用,从而实现对连接器的管理(请求这些servlet有ge方式和post方式),我们来测试查看连接器提供了哪些数据源连接类型,servlet请求相对路径为/getConnectorList,在浏览器打开http://localhost:8080/connector-manager/getConnectorList
上面可以看到,目前提供了数据库连接类型和http连接类型
如果我们要建立一个连接实例,则需要通过post方式请求相关servlet,首先需要获取需要提交哪些post参数,可以通过相对路径为/getConfigForm的servlet获取,在浏览器打开http://localhost:8080/connector-manager/getConfigForm?ConnectorType=DBConnector可以获取到数据库连接实例的post参数(如果是http连接器,则将参数修改为ConnectorType=http-connector)
上面只是简单的通过浏览器来请求连接器的servlet,更丰富的功能则需要以编程方式来请求这些servlet,从而实现连接器的管理
接下来本人在eclipse建立一个java project,命名为SerchEngine,在pom.xml文件添加相关依赖
<dependencies>
<!-- httpclient -->
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.2.3</version>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpmime</artifactId>
<version>4.2.3</version>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient-cache</artifactId>
<version>4.2.3</version>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>fluent-hc</artifactId>
<version>4.2.3</version>
</dependency> <dependency>
<groupId>dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>1.6.1</version>
</dependency>
</dependencies>
本人这里的servlet请求是通过httpclient组件实现的,所以添加了httpclient组件的相关依赖;然后提交的xml数据和返回的xml数据都是通过dom4j来解析的,所以同时添加了dom4j的相关依赖
为了实现方法的公用,本人这里建立一个servlet请求类ConnectorManagerRequestUtils,包括get方式与 post方式的请求,完整代码如下:
public class ConnectorManagerRequestUtils { /**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
ConnectorManager connectorManager=new ConnectorManager();
connectorManager.setUrl("http://localhost:8080/connector-manager"); Map<String, String> paramsMap=new HashMap<String, String>();
paramsMap.put("ConnectorType", "DBConnector"); Element element=ConnectorManagerRequestUtils.sendGet(connectorManager, "/getConfigForm", paramsMap);
//Element element=ConnectorManagerRequestUtils.sendGet(connectorManager, "/getConnectorList", paramsMap);
System.out.println(element.asXML()); }
private static final Logger LOGGER = Logger.getLogger(ConnectorManagerRequestUtils.class.getName()); public static Element sendGet(ConnectorManager connectorManager, String servletPath, Map<String, String> paramsMap) {
if (paramsMap == null) {
paramsMap = new HashMap<String, String>();
} try {
HttpParams params = new BasicHttpParams();
for (Iterator<String> it = paramsMap.keySet().iterator(); it.hasNext();) {
String paramName = (String) it.next();
String paramValue = (String) paramsMap.get(paramName);
params.setParameter(paramName, paramValue);
} HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
HttpProtocolParams.setContentCharset(params, "UTF-8");
HttpProtocolParams.setUserAgent(params, "HttpComponents/1.1");
HttpProtocolParams.setUseExpectContinue(params, true); BasicHttpProcessor httpproc = new BasicHttpProcessor();
// Required protocol interceptors
httpproc.addInterceptor(new RequestContent());
httpproc.addInterceptor(new RequestTargetHost());
// Recommended protocol interceptors
httpproc.addInterceptor(new RequestConnControl());
httpproc.addInterceptor(new RequestUserAgent());
httpproc.addInterceptor(new RequestExpectContinue()); HttpRequestExecutor httpexecutor = new HttpRequestExecutor(); HttpContext context = new BasicHttpContext(null);
URL connectorManagerURL = new URL(connectorManager.getUrl());
HttpHost host = new HttpHost(connectorManagerURL.getHost(), connectorManagerURL.getPort()); DefaultHttpClientConnection conn = new DefaultHttpClientConnection();
ConnectionReuseStrategy connStrategy = new DefaultConnectionReuseStrategy(); context.setAttribute(ExecutionContext.HTTP_CONNECTION, conn);
context.setAttribute(ExecutionContext.HTTP_TARGET_HOST, host); try {
String target = connectorManager.getUrl() + servletPath;
boolean firstParam = true;
for (Iterator<String> it = paramsMap.keySet().iterator(); it.hasNext();) {
String paramName = (String) it.next();
String paramValue = (String) paramsMap.get(paramName); if (firstParam) {
target += "?";
firstParam = false;
} else {
target += "&";
}
target += paramName + "=" + paramValue;
} if (!conn.isOpen()) {
Socket socket = new Socket(host.getHostName(), host.getPort());
conn.bind(socket, params);
}
BasicHttpEntityEnclosingRequest request = new BasicHttpEntityEnclosingRequest("GET", target);
LOGGER.fine(">> Request URI: " + request.getRequestLine().getUri()); request.setParams(params);
httpexecutor.preProcess(request, httpproc, context);
HttpResponse response = httpexecutor.execute(request, conn, context);
response.setParams(params);
httpexecutor.postProcess(response, httpproc, context); LOGGER.fine("<< Response: " + response.getStatusLine());
String entityText = EntityUtils.toString(response.getEntity());
LOGGER.fine(entityText);
LOGGER.fine("==============");
if (!connStrategy.keepAlive(response, context)) {
conn.close();
} else {
LOGGER.fine("Connection kept alive...");
} try {
Document xml = DocumentHelper.parseText(entityText);
return xml.getRootElement();
} catch (Exception e) {
LOGGER.severe("Error caused by text : " + entityText);
throw e;
}
} finally {
conn.close();
}
} catch (Exception e) {
throw new RuntimeException(e);
}
}
public static Element sendPost(ConnectorManager connectorManager, String servletPath, Document document) {
try {
HttpParams params = new BasicHttpParams();
HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
HttpProtocolParams.setContentCharset(params, "UTF-8");
HttpProtocolParams.setUserAgent(params, "HttpComponents/1.1");
HttpProtocolParams.setUseExpectContinue(params, true); BasicHttpProcessor httpproc = new BasicHttpProcessor();
// Required protocol interceptors
httpproc.addInterceptor(new RequestContent());
httpproc.addInterceptor(new RequestTargetHost());
// Recommended protocol interceptors
httpproc.addInterceptor(new RequestConnControl());
httpproc.addInterceptor(new RequestUserAgent());
httpproc.addInterceptor(new RequestExpectContinue()); HttpRequestExecutor httpexecutor = new HttpRequestExecutor(); HttpContext context = new BasicHttpContext(null); URL connectorManagerURL = new URL(connectorManager.getUrl());
HttpHost host = new HttpHost(connectorManagerURL.getHost(), connectorManagerURL.getPort()); DefaultHttpClientConnection conn = new DefaultHttpClientConnection();
ConnectionReuseStrategy connStrategy = new DefaultConnectionReuseStrategy(); context.setAttribute(ExecutionContext.HTTP_CONNECTION, conn);
context.setAttribute(ExecutionContext.HTTP_TARGET_HOST, host); try {
HttpEntity requestBody;
if (document != null) {
// OutputFormat format = OutputFormat.createPrettyPrint();
OutputFormat format = OutputFormat.createCompactFormat();
StringWriter stringWriter = new StringWriter();
XMLWriter xmlWriter = new XMLWriter(stringWriter, format);
xmlWriter.write(document);
String xmlAsString = stringWriter.toString();
requestBody = new StringEntity(xmlAsString, "UTF-8");
} else {
requestBody = null;
}
if (!conn.isOpen()) {
Socket socket = new Socket(host.getHostName(), host.getPort());
conn.bind(socket, params);
} String target = connectorManager.getUrl() + servletPath; BasicHttpEntityEnclosingRequest request = new BasicHttpEntityEnclosingRequest("POST", target);
request.setEntity(requestBody);
LOGGER.info(">> Request URI: " + request.getRequestLine().getUri()); request.setParams(params);
httpexecutor.preProcess(request, httpproc, context);
HttpResponse response = httpexecutor.execute(request, conn, context);
response.setParams(params);
httpexecutor.postProcess(response, httpproc, context); LOGGER.info("<< Response: " + response.getStatusLine());
String entityText = EntityUtils.toString(response.getEntity());
LOGGER.info(entityText);
LOGGER.info("==============");
if (!connStrategy.keepAlive(response, context)) {
conn.close();
} else {
LOGGER.info("Connection kept alive...");
} Document xml = DocumentHelper.parseText(entityText);
return xml.getRootElement();
} finally {
conn.close();
}
} catch (Exception e) {
throw new RuntimeException(e);
}
} }
现在运行该类的main方法,是不是在控制台看到和上面浏览器方式相同的输出呢?
更丰富的功能待后文接着分析,本文先到这里
---------------------------------------------------------------------------
本系列企业搜索引擎开发之连接器connector系本人原创
转载请注明出处 博客园 刺猬的温驯
本人邮箱: chenying998179@163#com (#改为.)
本文链接 http://www.cnblogs.com/chenying99/p/3222137.html
企业搜索引擎开发之连接器connector(十六)的更多相关文章
- 企业搜索引擎开发之连接器connector(二十六)
连接器通过监视器对象DocumentSnapshotRepositoryMonitor从上文提到的仓库对象SnapshotRepository(数据库仓库为DBSnapshotRepository)中 ...
- 企业搜索引擎开发之连接器connector(十九)
连接器是基于http协议通过推模式(push)向数据接收服务端推送数据,即xmlfeed格式数据(xml格式),其发送数据接口命名为Pusher Pusher接口定义了与发送数据相关的方法 publi ...
- 企业搜索引擎开发之连接器connector(三十)
连接器里面采用的什么样的数据结构,我们先从Document迭代器开始入手,具体的Document迭代器类都实现了DocumentList接口,该接口定义了两个方法 public interface D ...
- 企业搜索引擎开发之连接器connector(二十九)
在哪里调用监控器管理对象snapshotRepositoryMonitorManager的start方法及stop方法,然后又在哪里调用CheckpointAndChangeQueue对象的resum ...
- 企业搜索引擎开发之连接器connector(二十八)
通常一个SnapshotRepository仓库对象对应一个DocumentSnapshotRepositoryMonitor监视器对象,同时也对应一个快照存储器对象,它们的关联是通过监视器管理对象D ...
- 企业搜索引擎开发之连接器connector(二十五)
下面开始具体分析连接器是怎么与连接器实例交互的,这里主要是分析连接器怎么从连接器实例获取数据的(前面文章有涉及基于http协议与连接器的xml格式的交互,连接器对连接器实例的设置都是通过配置文件操作的 ...
- 企业搜索引擎开发之连接器connector(二十四)
本人在上文中提到,连接器实现了两种事件依赖的机制 ,其一是我们手动操作连接器实例时:其二是由连接器的自动更新机制 上文中分析了连接器的自动更新机制,即定时器执行定时任务 那么,如果我们手动操作连接器实 ...
- 企业搜索引擎开发之连接器connector(二十二)
下面来分析线程执行类,线程池ThreadPool类 对该类的理解需要对java的线程池比较熟悉 该类引用了一个内部类 /** * The lazily constructed LazyThreadPo ...
- 企业搜索引擎开发之连接器connector(二十)
连接器里面衔接数据源与数据推送对象的是QueryTraverser类对象,该类实现了Traverser接口 /** * Interface presented by a Traverser. Used ...
随机推荐
- python操作csv
# -*- coding: utf-8 -*- #python 27 #xiaodeng #CSV文件的写入(按行写入) import csv #csv文件,是一种常用的文本格式,用以存储表格数据,很 ...
- TypeScript--deno前置学习
第一节:前言: 1.JavaScript 的发展简史图: 2.关于node与deno: (1)Node与Deno 的区别:Node 可以工作,而 Deno 不行,Deno 只是一个原型或实验性产品. ...
- Python模块部分
模块初识及正则表达式 Python re模块与正则表达式的运用 Python中常用模块一 模块和包
- 呕心沥血Android studio使用JNI实例
发现网上很多JNI的使用教程,也很详细,不过有的地方有些缺漏,导致很多小问题难以解决的,今天就来总结一下. 准备工作:下载NDK. 简单的说,要用到C/C++,就要用NDK.直接百度搜索然后去官网下载 ...
- leetcode706
class MyHashMap { public: vector<int> hashMap; /** Initialize your data structure here. */ MyH ...
- mysql 随机查询 记录集
有时候需求需要随机从数据库查询若干条记录集,网上搜了一下,几篇博文都是些重复的.....不知道他们谁抄的谁的,这里除了介绍提供一种笔者自己想到的方法,本质都是利用mysql 的rand() 第一种方法 ...
- 从邮件原理来看 postfix和docecot
好早好早以前计算机网络老师就教了说,邮件嘛,就三个协议smtp,imap,pop3. smtp 用来发邮件,imap,pop3用来收邮件.噢?是么.难道没有发现这句话有非常多的漏洞,根本就不能说清楚这 ...
- powerdesigner 数据库表定义导出到excel
shift+ctrl+X,打开脚本运行,脚本如下:'************************************************************************** ...
- NHibernate注意事项
1.检查映射文件是否正确 2.检查配置文件的“嵌入的资源”选项 3.检查Configuration是否加载了程序集
- Spark之 使用SparkSql操作mysql和DataFrame的Scala实现
通过读取文件转换成DataFrame数据写入到mysql中 package com.zy.sparksql import java.util.Properties import org.apache. ...