文档章节

solr自己设置hadler

泡海椒
 泡海椒
发布于 2017/08/30 13:34
字数 912
阅读 21
收藏 0
点赞 0
评论 0

package com.solr.handler;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpException;
import org.apache.commons.httpclient.HttpStatus;
import org.apache.commons.httpclient.MultiThreadedHttpConnectionManager;
import org.apache.commons.httpclient.UsernamePasswordCredentials;
import org.apache.commons.httpclient.auth.AuthScope;
import org.apache.commons.httpclient.methods.GetMethod;
import org.apache.commons.httpclient.methods.PostMethod;
import org.apache.solr.common.SolrException;
import org.apache.solr.common.params.SolrParams;
import org.apache.solr.common.util.JavaBinCodec;
import org.apache.solr.common.util.NamedList;
import org.apache.solr.core.SolrCore;
import org.apache.solr.core.SolrEventListener;
import org.apache.solr.core.SolrInfoMBean;
import org.apache.solr.handler.RequestHandlerBase;
import org.apache.solr.request.SolrQueryRequest;
import org.apache.solr.response.SolrQueryResponse;
import org.apache.solr.search.SolrIndexSearcher;
import org.apache.solr.util.plugin.SolrCoreAware;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 *  解决多个solr server 共用一个索引目录时,当其中一个server commit后其他solr server需要reopen才能查询到数据
 *       <requestHandler name="/indexversion" class="com.paic.solr.handler.SharedIndexHandler" >
                <str name="notifyurl">http://localhost:7001/solr/indexversion;http://hcd-it-218:8983/solr/indexversion</str>
                <str name="way">update?commit=true</str>
         </requestHandler>  
 *
 *
 */
public class SharedIndexHandler extends RequestHandlerBase implements SolrCoreAware {
    private static final Logger LOG = LoggerFactory.getLogger(SharedIndexHandler.class.getName());
    private SolrCore core;
    private static HttpClient client;
    private HttpClient myHttpClient;
    private volatile Long indexVersion = 0L;

    private static synchronized HttpClient createHttpClient(String connTimeout, String readTimeout) {
        if (connTimeout == null && readTimeout == null && client != null)
            return client;
        MultiThreadedHttpConnectionManager mgr = new MultiThreadedHttpConnectionManager();
        // Keeping a very high number so that if you have a large number of cores
        // no requests are kept waiting for an idle connection.
        mgr.getParams().setDefaultMaxConnectionsPerHost(10000);
        mgr.getParams().setMaxTotalConnections(10000);
        mgr.getParams().setSoTimeout(readTimeout == null ? 20000 : Integer.parseInt(readTimeout)); //20 secs
        mgr.getParams().setConnectionTimeout(connTimeout == null ? 5000 : Integer.parseInt(connTimeout)); //5 secs
        HttpClient httpClient = new HttpClient(mgr);
        if (client == null && connTimeout == null && readTimeout == null)
            client = httpClient;
        return httpClient;
    }

    @Override
    public void inform(SolrCore core2) {
        this.core = core2;
        String urls = (String) initArgs.get(NOTIFYURL);
        if (urls == null || urls.trim().length() == 0)
            return;
        List<String> notifyurl = new ArrayList<String>();
        String[] urlsArray = urls.split(";");
        String hostip = null;
        try {
            hostip = java.net.InetAddress.getLocalHost().getHostAddress();
        } catch (java.net.UnknownHostException e) {
            LOG.error(e.getMessage(), e);
        }
        for (int i = 0; i < urlsArray.length; i++) {
            if (urlsArray[i].indexOf(hostip) > -1)
                continue;
            notifyurl.add(urlsArray[i]);
        }
        String way = (String) initArgs.get(NOTIFYWAY);

        String connTimeout = (String) initArgs.get(HTTP_CONN_TIMEOUT);
        String readTimeout = (String) initArgs.get(HTTP_READ_TIMEOUT);
        String httpBasicAuthUser = (String) initArgs.get(HTTP_BASIC_AUTH_USER);
        String httpBasicAuthPassword = (String) initArgs.get(HTTP_BASIC_AUTH_PASSWORD);
        myHttpClient = createHttpClient(connTimeout, readTimeout);
        if (httpBasicAuthUser != null && httpBasicAuthPassword != null) {
            myHttpClient.getState().setCredentials(AuthScope.ANY,
                    new UsernamePasswordCredentials(httpBasicAuthUser, httpBasicAuthPassword));
        }
        core.registerNewSearcherListener(getEventListener(notifyurl, way, myHttpClient));
        Map<String, SolrInfoMBean> reg = core.getInfoRegistry();
        SolrInfoMBean m = reg.get("searcher");
        try {
            indexVersion = (Long) m.getStatistics().get("indexVersion");
        } catch (Exception e) {
            LOG.error(e.getMessage(), e);
        }
    }

    @Override
    public void handleRequestBody(SolrQueryRequest req, SolrQueryResponse rsp) throws Exception {
        rsp.setHttpCaching(false);
        final SolrParams solrParams = req.getParams();
        String command = solrParams.get(COMMAND);
        if (command == null) {
            rsp.add(STATUS, OK_STATUS);
            rsp.add("message", "No command");
            return;
        } else if (command.equals(CMD_INDEX_VERSION)) {
            rsp.add(CMD_INDEX_VERSION, indexVersion);
        } else if (command.equals(CMD_SHARED_DATAIMPORT_STATUS)) {
            String urls = (String) initArgs.get(NOTIFYURL);
            String[] urlsArray = urls.split(";");
            //检查dataimport是否完成
            //http://localhost:7001/solr/indexversion
            //http://localhost:8983/solr/dataimport?command=status
            String dataimportStatus = DATA_IMPORT_IDLE_STAUTS;
            for (String url : urlsArray) {
                if(url==null||url.length()==0) continue;
                String queryUrl = url.substring(0, url.lastIndexOf("/") + 1) + "dataimport";
                dataimportStatus = queryDataimportStatus(queryUrl);
                if (!dataimportStatus.equals(DATA_IMPORT_IDLE_STAUTS))
                    break;
            }
            rsp.add("dataimporstatus", dataimportStatus);
        }
    }

    private String queryDataimportStatus(String queryUrl) {
        GetMethod getMethod = new GetMethod(queryUrl);
        getMethod.setQueryString("command=status&wt=javabin");
        String dataimportStatus = DATA_IMPORT_IDLE_STAUTS;
        try {
            int requestStatus = myHttpClient.executeMethod(getMethod);
            if (requestStatus == HttpStatus.SC_OK) {
                NamedList nl = (NamedList) new JavaBinCodec().unmarshal(getMethod.getResponseBodyAsStream());
                dataimportStatus = (String) nl.get("status");
                System.out.println(dataimportStatus);
            }
        } catch (HttpException e) {
            LOG.error("查询dataimport状态错误。", e);
        } catch (IOException e) {
            LOG.error("查询dataimport状态错误。", e);
        } finally {
            getMethod.releaseConnection();
        }
        return dataimportStatus;
    }

    @Override
    public String getDescription() {
        return "SharedIndexHandler used by multiple Solr servers and a shared index. to notify each other";
    }

    @Override
    public String getSourceId() {
        return "$Id: SharedIndexHandler.java 2012-09-15 $";
    }

    @Override
    public String getSource() {
        return "$URL: http://svn.apache.org/repos/asf/lucene/dev/tags/lucene_solr_3_6_0/com/paic/solr/handler/handler/SharedIndexHandler.java $";
    }

    @Override
    public String getVersion() {
        return "$Revision: 001 $";
    }

    /**
     *  在post commit执行时先判断远程服务器的版本和本地是否一致,
     *  不一致需要触发commit请求
     * @param notifyurls
     * @return
     */
    private SolrEventListener getEventListener(final List<String> notifyurls, final String way,
            final HttpClient httpclient) {
        return new SolrEventListener() {
            @Override
            public void init(NamedList args) {

            }

            @Override
            public void postCommit() {

            }

            @Override
            public void newSearcher(SolrIndexSearcher newSearcher, SolrIndexSearcher currentSearcher) {
                indexVersion = (Long) newSearcher.getStatistics().get("indexVersion");
                Thread t = new Thread(new Runnable() {
                    @Override
                    public void run() {
                        for (String url : notifyurls) {
                            NamedList response = null;
                            try {
                                response = getLatestVersion(url);
                            } catch (Exception e) {
                                LOG.error(" 获取索引版本信息失败: " + e.getMessage());
                                continue;
                            }
                            long latestVersion = (Long) response.get(CMD_INDEX_VERSION);
                            LOG.info(url + ":" + latestVersion + "   本地:" + indexVersion);
                            if (indexVersion == latestVersion) {
                                continue;
                            }
                            String notifyurl = url.substring(0, url.lastIndexOf("/") + 1) + way;
                            LOG.info("need to notify=" + notifyurl);
                            GetMethod getMethod = new GetMethod(notifyurl);
                            try {
                                int statusCode = httpclient.executeMethod(getMethod);
                                if (statusCode == HttpStatus.SC_OK) {
                                    LOG.info("请求:" + notifyurl + "成功.");
                                }
                            } catch (HttpException e) {
                                LOG.error("触发请求" + notifyurl + "失败");
                            } catch (IOException e) {
                                LOG.error("触发请求" + notifyurl + "失败");
                            } finally {
                                getMethod.releaseConnection();
                            }
                        }
                    }
                });
                t.start();

            }

            @SuppressWarnings("unchecked")
            NamedList getLatestVersion(String notifyUrl) throws IOException {
                PostMethod post = new PostMethod(notifyUrl);
                post.addParameter(COMMAND, CMD_INDEX_VERSION);
                post.addParameter("wt", "javabin");
                return getNamedListResponse(post);
            }

            private NamedList getNamedListResponse(PostMethod method) throws IOException {
                try {
                    int status = httpclient.executeMethod(method);
                    if (status != HttpStatus.SC_OK) {
                        throw new SolrException(SolrException.ErrorCode.SERVICE_UNAVAILABLE,
                                "Request failed for the url " + method);
                    }
                    return (NamedList) new JavaBinCodec().unmarshal(method.getResponseBodyAsStream());
                } finally {
                    try {
                        method.releaseConnection();
                    } catch (Exception e) {
                    }
                }
            }
        };
    }

    public static final String NOTIFYURL = "notifyurl";
    public static final String NOTIFYWAY = "way";
    public static final String HTTP_CONN_TIMEOUT = "httpConnTimeout";
    public static final String COMMAND = "command";
    public static final String HTTP_READ_TIMEOUT = "httpReadTimeout";
    public static final String HTTP_BASIC_AUTH_USER = "httpBasicAuthUser";
    public static final String HTTP_BASIC_AUTH_PASSWORD = "httpBasicAuthPassword";
    public static final String STATUS = "status";
    public static final String ERR_STATUS = "ERROR";
    public static final String OK_STATUS = "OK";
    public static final String CMD_INDEX_VERSION = "indexversion";
    public static final String CMD_SHARED_DATAIMPORT_STATUS = "dataimportstatus";
    public static final String DATA_IMPORT_IDLE_STAUTS = "idle";

}
 

© 著作权归作者所有

共有 人打赏支持
泡海椒
粉丝 10
博文 279
码字总数 291526
作品 0
成都
程序员
IntelliJ IDEA如果优先导入本工程目录中的类,而非jar包中的类?

目前有这样的需求,重写solr的某个源码类 比如:solr-core.jar中有个类的路径是org.apache.search.SolrIndexSearch.java. 我想在自己的工程中引用solr-core.jar ,自己的工程中新建一个java文...

雷决
2015/10/29
1K
3
solr-集群安装搭建-入门

0,下载安装源码,solr的官网是 :http://lucene.apache.org/solr/ 1,解压出 源码中的安装脚本。假如 安装源码是: solr-5.4.0.tgz,那么执行命令是: tar -zxvf solr-5.4.0.tgz solr-5.4....

岸芷汀兰
2015/12/31
111
0
Solr基础--设置solr/home的三种方式

这是在开源中国的第一篇博文,希望将自己遇到的问题,搜藏的笔记跟大家共享,当然今天的内容也不是本人原创,仅仅作为一个开始。争取以后多多原创。 solr/home是solr实例化core核的依据和入口...

devjing
2013/03/27
0
0
ubuntu14.04下tomcat7部署solr-4.10.4

看过好多安装的博文,结合了几篇打算自己写一个简单的整合步奏,首先保证安装了jdk和tomcat 1.下载solr-4.10.4,解压到/opt下 2.为 solr 选择一个目录,并使用 SOLR_HOME 环境变量指向这个目录...

开挂奥特曼
2015/05/11
0
0
创建solr7.3.0集群_测试集群_添加中文分词器_导入数据

solr是apache下的一个用于做搜索引擎的高级项目,使用它可以满足绝大部分应用的搜索需求。 主机环境: Linux:centos6.5 JDK:1.8 solr:7.3.0 zookeeper:3.4.8 mmseg4j-solr:2.4.0 1. 创建与启...

特拉仔
04/25
0
0
基于 SpringBoot 微服务的谷钉出行社群--Goodeen

一、何谓『谷钉』? 芸芸众生都是这浩瀚的宇宙的游客。世界太大,每个人都如同沧海一粟(谷钉之谷也)一般。但是我相信无论何时,总有那么一些爱好自由、乐于分享,并如钉子般执着精神的人(谷钉...

商鲲
2017/09/12
510
0
solr4.9在tomcat7下安装、配置

solr简介 solr是受欢迎的,速度极快的开源企业搜索平台。主要功能包括强大的全文搜索,搜索词高亮显示,分面搜索,近实时的索引,动态聚类,数据库集成,丰富的文件(例如,Word,PDF)处理,...

cloud-coder
2014/08/21
0
1
深入剖析SolrCloud(一)

SolrCloud是基于Solr和Zookeeper的分布式搜索方案,是正在开发中的Solr4.0的核心组件之一,它的主要思想是使用Zookeeper作为集群的配置信息中心。它有几个特色功能:1)集中式的配置信息 2)...

嗯哼9925
01/07
0
0
solr安装与配置

前提准备: 环境必须是tomcat7.0以上,jdk7.0以上,jre7.0以上,且配置好环境变量。 从官网下载最新版本 1、解压并将solr-4.10.2/example/webapps 下的solr.war拷贝到webapps下手动启动tomca...

hello_bear
2016/08/04
11
0
solr新版本环境搭建

solr环境介绍 solr5.5 java1.7 mysql zookeeper solr这里使用的是solr5.5,因为该版本仍然支持jdk1.7适用性较广,但是该方法也能用在solr6.0上。通过该方法我们会搭建一个可以从数据库导入数...

千惊万喜
2016/09/06
45
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

python3.6用的外库遇到的问题

要用到wmi库 pip install wmi 装后不能用还要安装pywin32库。 要用到crypto加密模块安装pip instal pycrypto装后不能用。要安装pycryptodome。...

oisan_
11分钟前
0
0
select, poll, epoll I/O复用介绍

什么是I/O复用? 内核监视多个文件描述符(I/O文件句柄),一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知应用程序进行相应的读写操作。 I/O多路复用又被称为“事件驱动”(比如读写事...

xiaoxlm
12分钟前
0
0
【Spring 系列 给IOC容器添加组件的几种方式总结】

给Spring 注册Bean的几种方式总结。其中使用@Import注解是Spring Boot 完成自动配置的一个核心注解。 1、Spring 中给IOC容器添加组件的几种方式 在Spring的配置文件中,配置Bean(基于XML方式...

HansonReal
13分钟前
3
0
bootstrapTable语言包设置

###方法一引入不同的语言包 <script src="bootstrap-table-zh-CN.js"></script> ###方法二引入全语言包 <script src="bootstrap-table-locale-all.min.js"></script>//然后在初始化前设计默......

momo1987
14分钟前
0
0
Saltstack 常用命令

1、拷贝文件到客户端 # salt 'slaver.test.com' cp.get_file salt://apache.sls /tmp/cp.txt 2、拷贝目录到客户端 # salt 'slaver.test.com' cp.get_dir salt://test /tmp 3、显示存活的客户......

硅谷课堂
14分钟前
0
0
致初学者-如何学好Python这门编程语言?[图]

致初学者-如何学好Python这门编程语言?[图]: 对于很多Python3初学者,往往会面临以下问题:Python2和Python3我该学习哪一个?是否要安装Linux系统学习Python?Python3有各种版本我该安装哪...

原创小博客
17分钟前
1
0
E31---setopt=protected_multilib=false

今天在云服务器上装nginx,需要先安装一些依赖库比如zlib, ,但是安装zlib时候报错。 yum install -y zlib zlib-devel 1 (-y 指的是如果需要选yes no的自动y)下面是报错 Protected multil...

侠客行之石头
21分钟前
0
0
HTTP常见面试题

Http与Https的区别: HTTP 的URL 以http:// 开头,而HTTPS 的URL 以https:// 开头 HTTP 是不安全的,而 HTTPS 是安全的 HTTP 标准端口是80 ,而 HTTPS 的标准端口是443 在OSI 网络模型中,H...

JK_OPERA
23分钟前
0
0
python爬取站长素材网页图片保存到ppt中

网站地址:http://sc.chinaz.com/tupian/index.html 直接上代码: import requestsfrom bs4 import BeautifulSoupfrom pptx import Presentationfrom pptx.util import Inchesimpor......

你为什么不吃药
24分钟前
1
0
Ubuntu 18.04 swap空间的修改

一、准备工作 执行“sudo swapon -s”命令,查看是否已经存在swap file 二、修改swap file # 如果第一步存在swapfile则需要先禁用sudo swapoff /swapfile# 修改swap 空间的大小为2Gs...

Iceberg_XTY
27分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部