封装一个简单的solrserver组件

一个简单的solrserver组件


实现索引更新的异步处理,以及查询接口,日志/线程池/队列监控没有加上。

SolrDocment封装

接口:


public interface ISolrDocument {

public SolrInputDocument convertToInputDocument() throws Exception;

public void buildSolrDocument(SolrDocument document) throws Exception;

}

实现:


public class SolrDocumentImpl implements ISolrDocument {
@Override
public SolrInputDocument convertToInputDocument() throws Exception{
final SolrInputDocument doc = new SolrInputDocument();

Field[] fields = this.getClass().getDeclaredFields();
for (Field f : fields) {
f.setAccessible(true);
String idxName = f.getName();
Object fieldValue =f.get(this);
doc.addField(idxName, fieldValue);
}
return doc;
}

@Override
public void buildSolrDocument(SolrDocument document) throws Exception{
Field[] fields = this.getClass().getDeclaredFields();
for (Field f : fields) {
f.setAccessible(true);

String idxName = f.getName();

Object fieldValue = document.get(idxName);
f.set(this, fieldValue);

}
}

查询结构集封装


public class DataResult<T> {
private int start;
private int limits;
private long totalRecord;
private List<T> records;

public int getLimits() {
return limits;
}

public void setLimits(int limits) {
this.limits = limits;
}

public long getTotalRecord() {
return totalRecord;
}

public void setTotalRecord(long totalRecord) {
this.totalRecord = totalRecord;
}

public List<T> getRecords() {
return records;
}

public void setRecords(List<T> records) {
this.records = records;
}

public int getStart() {
return start;
}

public void setStart(int start) {
this.start = start;
}
}

SolrServer封装


接口:


public interface ISolrServer {

public ThreadPoolExecutor getThreadPool();

void init() throws Exception;

/**
* 索引优化
*/
void optimize();

/**
* 清理索引
* @param query
*/
void clearDocs(SolrQuery query);

/**
* 批量更新索引
*
* @param docs
*/
void batchUpdateDocs(List<ISolrDocument> docs);

/**
* 分页查询
*
* @param clazz
* @param query
* @return
*/
public <T extends ISolrDocument> DataResult<T> pageSearch(SolrQuery query, Class<T> clazz);

void destory() throws Exception;
}

实现:


public class SolrServerImpl implements ISolrServer {

private CloudSolrServer solrServer;
private String zookeeperStr;
private String coreName;
private String idName;
private int corePoolSize;
private int maxPoolSize;
private int threadQueueSize;
private ThreadPoolExecutor threadPool;
@Override
public void init() throws Exception {
this.threadPool
= new ThreadPoolExecutor(corePoolSize,
maxPoolSize,
10000,
TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>(threadQueueSize),
new SolrThreadFactory("solr-pool"),
new ThreadPoolExecutor.DiscardOldestPolicy());
solrServer=new CloudSolrServer(this.zookeeperStr);
solrServer.setDefaultCollection(coreName);
solrServer.setIdField(idName);
solrServer.setZkClientTimeout(10000);
solrServer.setZkConnectTimeout(5000);
}

@Override
public void optimize() {

}

@Override
public void clearDocs(final SolrQuery query) {
this.threadPool.execute(new Runnable() {
@Override
public void run() {
try {
SolrServerImpl.this.solrServer.deleteByQuery(query.getQuery());
SolrServerImpl.this.solrServer.commit(false, false, true);
}catch (Exception e){
e.printStackTrace();
}

}
});
}

@Override
public void batchUpdateDocs(List<ISolrDocument> docs) {
try {
List<SolrInputDocument> inputDocs=new ArrayList<SolrInputDocument>();
for(ISolrDocument doc:docs){
inputDocs.add(doc.convertToInputDocument());
}
this.solrServer.add(inputDocs);
this.solrServer.commit(false,false,true);
}catch (Exception e){
e.printStackTrace();
}
}

@Override
public <T extends ISolrDocument> DataResult<T> pageSearch(SolrQuery query, Class<T> clazz) {
int limit=query.getRows()==0?20:query.getRows();
int start=query.getStart();
List<T> dataResults=new ArrayList<T>(limit);
DataResult datas=new DataResult();
datas.setLimits(limit);
datas.setStart(start);
try{
QueryResponse response= this.solrServer.query(query);
SolrDocumentList solrDocumentList=response.getResults();
datas.setTotalRecord(solrDocumentList.getNumFound());
for (SolrDocument doc :solrDocumentList){
T iSolrDocument=clazz.newInstance();
iSolrDocument.buildSolrDocument(doc);
dataResults.add(iSolrDocument);
}
datas.setRecords(dataResults);
}catch (Exception e){
e.printStackTrace();
}

return datas;
}

@Override
public void destory() throws Exception {
this.solrServer.shutdown();

}

public void setIdName(String idName) {
this.idName = idName;
}

public void setCoreName(String coreName) {
this.coreName = coreName;
}

public void setZookeeperStr(String zookeeperStr) {
this.zookeeperStr = zookeeperStr;
}

public CloudSolrServer getSolrServer() {
return solrServer;
}

public void setSolrServer(CloudSolrServer solrServer) {
this.solrServer = solrServer;
}

public String getZookeeperStr() {
return zookeeperStr;
}

public String getCoreName() {
return coreName;
}

public String getIdName() {
return idName;
}

public int getCorePoolSize() {
return corePoolSize;
}

public void setCorePoolSize(int corePoolSize) {
this.corePoolSize = corePoolSize;
}

public int getMaxPoolSize() {
return maxPoolSize;
}

public void setMaxPoolSize(int maxPoolSize) {
this.maxPoolSize = maxPoolSize;
}

public int getThreadQueueSize() {
return threadQueueSize;
}

public void setThreadQueueSize(int threadQueueSize) {
this.threadQueueSize = threadQueueSize;
}

public ThreadPoolExecutor getThreadPool() {
return threadPool;
}

public void setThreadPool(ThreadPoolExecutor threadPool) {
this.threadPool = threadPool;
}
}

任务处理封装


public class BatchTaskExecutor{

private ISolrServer iSolrServer;

private int batchSize = 100;

private int queueLength = 2000;

private int workThreadSize = 2;

private Semaphore semaphore;

private LinkedBlockingQueue<ISolrDocument> docQueue;

public void init(){
this.semaphore = new Semaphore(this.workThreadSize);
docQueue = new LinkedBlockingQueue<ISolrDocument>(this.queueLength);
while(true){
this.iSolrServer.getThreadPool().execute(new Runnable() {
@Override
public void run() {
List<ISolrDocument> list=BatchTaskExecutor.this.batchPollDocs();
BatchTaskExecutor.this.acquire();
try {
BatchTaskExecutor.this.iSolrServer.batchUpdateDocs(list);
}catch (Exception e){
e.printStackTrace();
}finally {
BatchTaskExecutor.this.release();
}
}
});
}

}

public boolean acquire() {
try {
return this.semaphore.tryAcquire(1,10, TimeUnit.SECONDS);
} catch (InterruptedException e) {
e.printStackTrace();
return false;
}
}

public void release() {
this.semaphore.release();
}

public boolean offerDoc(ISolrDocument doc) {

try {
return this.docQueue.offer(doc, 1000, TimeUnit.MILLISECONDS);
} catch (Exception e) {
e.printStackTrace();
}
return false;
}

public List<ISolrDocument> batchPollDocs() {

List<ISolrDocument> docs = new ArrayList<ISolrDocument>(this.batchSize);
while (docs.size() < this.batchSize) {
ISolrDocument doc = null;
try {
doc = this.docQueue.poll(1000, TimeUnit.MILLISECONDS);
} catch (Exception e) {
e.printStackTrace();
} finally {
if (doc==null) {
break;
} else {
docs.add(doc);
}
}

}
return docs;
}
}

封装一个简单的solrserver组件,布布扣,bubuko.com

时间: 2024-10-22 07:44:24

封装一个简单的solrserver组件的相关文章

封装一个简单的UI组件

方法其实很简单,用一个函数把整个过程包起来.调用时用new,这样可以在一个页面使用多个改组件.这是一个非常简单的方法,后面还有很大改进的空间.下面是一个封装日历的示例. 现在我们的组件类似bootstrap,写好下面的html结构,然后引入ui.css和ui.js,就可以生成相应的UI组件了.效果如上图. <!doctype html> <html> <head> <meta charset="UTF-8"> <title>C

Directx11学习笔记【四】 封装一个简单的Dx11DemoBase

根据前面两个笔记的内容,我们来封装一个简单的基类,方便以后的使用. 代码和前面类似,没有什么新的内容,直接看代码吧(由于代码上次都注释了,这次代码就没怎么写注释o(╯□╰)o) Dx11DemoBase.h Dx11DemoBase.h #pragma once #include <d3d11.h> #include <D3DX11.h> #include <DxErr.h> class Dx11DemoBase { public: Dx11DemoBase(); vi

《COM原理与应用》学习笔记——一个简单的COM组件的实现

今天带来一个简单的COM组件的实现,非常的简单.这个组件只是简单的完成了整数的加减乘除~ 首先,先罗列需要的COM接口,这里需要的接口非常简单,就是加减乘除的接口.所以定义一个ICalc类,当然这个类继承于IUnknown. 1 class ICalc : public IUnknown 2 { 3 public: 4 virtual long __stdcall add(long a, long b) = 0; 5 virtual long __stdcall minus(long a, lo

代码改变世界 | 如何封装一个简单的 Koa

下面给大家带来:封装一个简单的 KoaKoa 是基于 Node.js 平台的下一代 web 开发框架Koa 是一个新的 web 框架,可以快速而愉快地编写服务端应用程序,本文将跟大家一起学习:封装一个简单的 Koa一个简单的 http 服务使用 node 提供的 http 模块,可以很容易的实现一个基本的 http 服务器,新建一个 application.js 文件,内容如下: const http = require('http') const server = http.createSer

Python+Selenium进阶版(八)- Python自定义封装一个简单的Log类

目标:如何写一个Python日志类,用来输出不同级别的日志信息到本地文件夹下的日志文件里. 练习场景: 我们需要封装一个简单的日志类,主要有以下内容: 1.生成的日志文件格式是 年月日分秒.log 2.生成的XXX.log文件存储在项目根目录下Logs文件夹下 3.这个日志类,支持INFO,ERROR两种日志级别 4.日志里,每行日志输出,时间日期+执行类名称+日志级别+日志描述 解决思路: 1.在根目录下新建一个Logs的文件夹,获取这个Log的相对路径: 2.日志的保存命名,需要系统时间:

你用过不写代码就能完成一个简单模块的组件么?

开篇四连问 你是否懒得写普通的增删改查方法? 你是否不喜欢代码生成插件的重复代码? 你是否渴望一个没有冗余代码的项目? 你是否渴望一行代码都不用写就能完成一个简单的模块? 组件由来 作为后端程序员,相信大家都写过以下几种代码: 根据主键查询 多条件分页查询 插入 根据主键修改 根据主键删除(单个或批量) 抛开业务来说,这几种代码是我们项目中最最基本的代码了,每一个项目中都会出现大量的这种代码.那么你的项目中这种代码你是怎么写的呢? 按照dao-service-controller的流程写? co

C 封装一个简单二叉树基库

引文 今天分享一个喜欢佩服的伟人,应该算人类文明极大突破者.收藏过一张纸币类型如下 那我们继续科普一段关于他的简介 '高斯有些孤傲,但令人惊奇的是,他春风得意地度过了中产阶级的一生,而  没有遭受到冷酷现实的打击:这种打击常无情地加诸于每个脱离现实环境生活的  人.或许高斯讲求实效和追求完美的性格,有助于让他抓住生活中的简单现实.  高斯22岁获博士学位,25岁当选圣彼德堡科学院外籍院士,30岁任哥廷根大学数  学教授兼天文台台长.虽说高斯不喜欢浮华荣耀,但在他成名后的五十年间,这  些东西就像

哪种缓存效果高?开源一个简单的缓存组件j2cache

背景 现在的web系统已经越来越多的应用缓存技术,而且缓存技术确实是能实足的增强系统性能的.我在项目中也开始接触一些缓存的需求. 开始简单的就用jvm(java托管内存)来做缓存,这样对于单个应用服务器来说很好. 为了系统的可用性,需要做灾备,那么就要多准备一套系统环境,这时就会有一些共享资源的问题,比如Tomcat的session共享出来 几个系统会公用一套缓存数据,这样就变成一个共享池 需求的增长也就带来了系统的变化,也正为这种变化我开始思考怎么让这些代码兼容,并为以后的系统模块提供比较统一

封装一个简单好用的打印Log的工具类And快速开发系列 10个常用工具类

快速开发系列 10个常用工具类 http://blog.csdn.net/lmj623565791/article/details/38965311 ------------------------------------------------------------------------------------------------ 不知众多Android开发者是否在程序开发的工程中也遇到过下面的问题: 0.如何在众多log中快速找到你设置打印的那行log? 1.是否还在不断的切换标签来