本人有一段时间没有接触企业搜索引擎之连接器的开发了,连接器是涉及企业搜索引擎一个重要的组件,在数据源与企业搜索引擎中间起一个桥梁的作用,类似于数据库之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(十六)的更多相关文章

  1. 企业搜索引擎开发之连接器connector(二十六)

    连接器通过监视器对象DocumentSnapshotRepositoryMonitor从上文提到的仓库对象SnapshotRepository(数据库仓库为DBSnapshotRepository)中 ...

  2. 企业搜索引擎开发之连接器connector(十九)

    连接器是基于http协议通过推模式(push)向数据接收服务端推送数据,即xmlfeed格式数据(xml格式),其发送数据接口命名为Pusher Pusher接口定义了与发送数据相关的方法 publi ...

  3. 企业搜索引擎开发之连接器connector(三十)

    连接器里面采用的什么样的数据结构,我们先从Document迭代器开始入手,具体的Document迭代器类都实现了DocumentList接口,该接口定义了两个方法 public interface D ...

  4. 企业搜索引擎开发之连接器connector(二十九)

    在哪里调用监控器管理对象snapshotRepositoryMonitorManager的start方法及stop方法,然后又在哪里调用CheckpointAndChangeQueue对象的resum ...

  5. 企业搜索引擎开发之连接器connector(二十八)

    通常一个SnapshotRepository仓库对象对应一个DocumentSnapshotRepositoryMonitor监视器对象,同时也对应一个快照存储器对象,它们的关联是通过监视器管理对象D ...

  6. 企业搜索引擎开发之连接器connector(二十五)

    下面开始具体分析连接器是怎么与连接器实例交互的,这里主要是分析连接器怎么从连接器实例获取数据的(前面文章有涉及基于http协议与连接器的xml格式的交互,连接器对连接器实例的设置都是通过配置文件操作的 ...

  7. 企业搜索引擎开发之连接器connector(二十四)

    本人在上文中提到,连接器实现了两种事件依赖的机制 ,其一是我们手动操作连接器实例时:其二是由连接器的自动更新机制 上文中分析了连接器的自动更新机制,即定时器执行定时任务 那么,如果我们手动操作连接器实 ...

  8. 企业搜索引擎开发之连接器connector(二十二)

    下面来分析线程执行类,线程池ThreadPool类 对该类的理解需要对java的线程池比较熟悉 该类引用了一个内部类 /** * The lazily constructed LazyThreadPo ...

  9. 企业搜索引擎开发之连接器connector(二十)

    连接器里面衔接数据源与数据推送对象的是QueryTraverser类对象,该类实现了Traverser接口 /** * Interface presented by a Traverser. Used ...

随机推荐

  1. 3.docker学习之docker与虚拟化

    虚拟化技术是一个总称,是一系列实现虚拟技术的统称.从广义上来说,虚拟化技术包括了虚拟机技术和容器技术, 所谓虚拟化技术最大的特点就是将一个真实的机器进行虚拟地分割,然后分割出来的部分可以独立使用   ...

  2. linux中awk工具

    awk sed以行为单位处理文件,awk比sed强的地方在于不仅能以行为单位还能以列为单位处理文件.awk缺省的行分隔符是换行,缺省的列分隔符是连续的空格和Tab,但是行分隔符和列分隔符都可以自定义, ...

  3. System.DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") 显示24小时制;System.DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss")显示12小时制

    this.Label6.Text = "当前时间:" + System.DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") ...

  4. Please specify exact device preset UUID

    Please specify exact device preset UUID 重启RAD IDE,重新选择 IOS Simulator ,iphone 机型!

  5. DataSnap 连接池 DSServer1Disconnect

    DataSnap Server DSServer1Disconnect 这个函数什么时候执行? void __fastcall TServerContainer1::DSServer1Disconne ...

  6. EXPLAIN sql优化方法(2) Using temporary ; Using filesort

    优化GROUP BY语句   默认情况下,MySQL对所有GROUP BY col1,col2...的字段进行排序.这与在查询中指定ORDER BY col1,col2...类似.因此,如果显式包括一 ...

  7. React文档总结

    元素渲染 更新元素渲染 计时器例子 function tick(){ const element = ( <div> <h1>Hello, World!</h1> ...

  8. 【原】Coursera—Andrew Ng机器学习—课程笔记 Lecture 9_Neural Networks learning

    神经网络的学习(Neural Networks: Learning) 9.1 代价函数 Cost Function 参考视频: 9 - 1 - Cost Function (7 min).mkv 假设 ...

  9. SQL 组内排序

    SELECT t_time, code, name, CL, row_number () OVER (partition BY t_time ORDER BY cl) AS 组内排名1, --T_ti ...

  10. CCS5连接调试C64X系列DSP核

    CCS从3.3改版为5.X之后,CCS 变化很大.DaVinci芯片中DSP的调试步骤也不同了.这里介绍下在CCS里如何调试DaVinci的DSP核心 1. 创建CCS V5版本的project 本人 ...