前面分享了如何用mysql热更新文档,现在这篇用tomcat http的方式更新。
原理分析
上次说到他会有一个定时任务刷新,这个定时任务也会扫描http的方式拉取远程的词典,对源码做了以下分析:
监控流程:
①向词库服务器发送Head请求
②从响应中获取Last-Modify、ETags字段值,判断是否变化
③如果未变化,休眠1min,返回第①步
④如果有变化,重新加载词典
⑤休眠1min,返回第①步
public void runUnprivileged() {
//超时设置
RequestConfig rc = RequestConfig.custom().setConnectionRequestTimeout(10*1000)
.setConnectTimeout(10*1000).setSocketTimeout(15*1000).build();
HttpHead head = new HttpHead(location);
head.setConfig(rc);
//设置请求头
if (last_modified != null) {
head.setHeader("If-Modified-Since", last_modified);
}
if (eTags != null) {
head.setHeader("If-None-Match", eTags);
}
CloseableHttpResponse response = null;
try {
response = httpclient.execute(head);
//返回200 才做操作
if(response.getStatusLine().getStatusCode()==200){
if (((response.getLastHeader("Last-Modified")!=null) && !response.getLastHeader("Last-Modified").getValue().equalsIgnoreCase(last_modified))
||((response.getLastHeader("ETag")!=null) && !response.getLastHeader("ETag").getValue().equalsIgnoreCase(eTags))) {
// 远程词库有更新,需要重新加载词典,并修改last_modified,eTags
Dictionary.getSingleton().reLoadMainDict();
last_modified = response.getLastHeader("Last-Modified")==null?null:response.getLastHeader("Last-Modified").getValue();
eTags = response.getLastHeader("ETag")==null?null:response.getLastHeader("ETag").getValue();
}
}else if (response.getStatusLine().getStatusCode()==304) {
//没有修改,不做操作
//noop
}else{
logger.info("remote_ext_dict {} return bad code {}" , location , response.getStatusLine().getStatusCode() );
}
} catch (Exception e) {
logger.error("remote_ext_dict {} error!",e , location);
}finally{
try {
if (response != null) {
response.close();
}
} catch (IOException e) {
logger.error(e.getMessage(), e);
}
}
}
这个就是通过httpclient远程请求你在ik配置里面的配置,每次会看head和ETag是否有变化。ok,来波实操。
二、实践
准备一个tomcat8
(base) batmandeMacBook-Pro:ROOT batman$ pwd
/Users/batman/Downloads/apache-tomcat-8.5.49/webapps/ROOT
(base) batmandeMacBook-Pro:ROOT batman$ touch hot_ext.dic && touch hot_stopwords.dic
(base) batmandeMacBook-Pro:ROOT batman$ ls
RELEASE-NOTES.txt bg-upper.png tomcat.css
WEB-INF favicon.ico tomcat.gif
asf-logo-wide.svg hot_ext.dic tomcat.png
bg-button.png hot_stopwords.dic tomcat.svg
bg-middle.png index.jsp
bg-nav.png tomcat-power.gif
(base) batmandeMacBook-Pro:ROOT batman$
启动tomcat,可以访问hot_ext.dic文件即可
配置ik分词器
/Users/batman/Downloads/elasticsearch-6.4.3-http/plugins/elasticsearch-analysis-ik-6.4.3-http/config
(base) batmandeMacBook-Pro:config batman$ vim IKAnalyzer.cfg.xml
配置IKAnalyzer.cfg.xml,添加配置
<!--用户可以在这里配置远程扩展字典 -->
<entry key="remote_ext_dict">http://localhost:8080/hot_ext.dic</entry>
<!--用户可以在这里配置远程扩展停止词字典-->
<entry key="remote_ext_stopwords">http://localhost:8080/hot_stopwords.dic</entry>
启动es,开始测试
修改tomcat,webapp/ROOT/hot_ext.dict文件,添加字典,查看日志
就这样,再次查看es分词
可以看到,已经加载了远程的词典。