diff --git a/src/main/java/org/wltea/analyzer/dic/Monitor.java b/src/main/java/org/wltea/analyzer/dic/Monitor.java new file mode 100644 index 0000000..c051cc0 --- /dev/null +++ b/src/main/java/org/wltea/analyzer/dic/Monitor.java @@ -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); + } + } + } + +}