Create Monitor.java
监控线程,监控远程词典的更新
This commit is contained in:
parent
092a9ad769
commit
11a8947603
96
src/main/java/org/wltea/analyzer/dic/Monitor.java
Normal file
96
src/main/java/org/wltea/analyzer/dic/Monitor.java
Normal file
@ -0,0 +1,96 @@
|
|||||||
|
package org.wltea.analyzer.dic;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
import org.apache.http.Header;
|
||||||
|
import org.apache.http.client.ClientProtocolException;
|
||||||
|
import org.apache.http.client.config.RequestConfig;
|
||||||
|
import org.apache.http.client.methods.CloseableHttpResponse;
|
||||||
|
import org.apache.http.client.methods.HttpHead;
|
||||||
|
import org.apache.http.impl.client.CloseableHttpClient;
|
||||||
|
import org.apache.http.impl.client.HttpClients;
|
||||||
|
import org.wltea.analyzer.help.Sleep;
|
||||||
|
import org.wltea.analyzer.help.Sleep.Type;
|
||||||
|
|
||||||
|
public class Monitor implements Runnable {
|
||||||
|
|
||||||
|
private static CloseableHttpClient httpclient = HttpClients.createDefault();
|
||||||
|
/*
|
||||||
|
* 上次更改时间
|
||||||
|
*/
|
||||||
|
private String last_modified;
|
||||||
|
/*
|
||||||
|
* 资源属性
|
||||||
|
*/
|
||||||
|
private String eTags;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* 请求地址
|
||||||
|
*/
|
||||||
|
private String location;
|
||||||
|
|
||||||
|
public Monitor(String location) {
|
||||||
|
this.location = location;
|
||||||
|
this.last_modified = null;
|
||||||
|
this.eTags = null;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* 监控流程:
|
||||||
|
* ①向词库服务器发送Head请求
|
||||||
|
* ②从响应中获取Last-Modify、ETags字段值,判断是否变化
|
||||||
|
* ③如果未变化,休眠1min,返回第①步
|
||||||
|
* ④如果有变化,重新加载词典
|
||||||
|
* ⑤休眠1min,返回第①步
|
||||||
|
*/
|
||||||
|
|
||||||
|
public void run() {
|
||||||
|
//超时设置
|
||||||
|
RequestConfig rc = RequestConfig.custom().setConnectionRequestTimeout(10*1000)
|
||||||
|
.setConnectTimeout(10*1000).setSocketTimeout(15*1000).build();
|
||||||
|
while (true) {
|
||||||
|
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);
|
||||||
|
|
||||||
|
//返回304 Not Modified,词库未更新
|
||||||
|
if(response.getStatusLine().getStatusCode()==304){
|
||||||
|
continue;
|
||||||
|
}else if(response.getStatusLine().getStatusCode()==200){
|
||||||
|
|
||||||
|
if (!response.getLastHeader("Last-Modified").getValue().equalsIgnoreCase(last_modified)
|
||||||
|
||!response.getLastHeader("ETags").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("ETags")==null?null:response.getLastHeader("ETags").getValue();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
} catch (ClientProtocolException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}finally{
|
||||||
|
try {
|
||||||
|
response.close();
|
||||||
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
Sleep.sleep(Type.SEC, 60);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user