2.2 系统请求响应封装模块
系统首先从request的信息中获取请求的类型,并依据请求的类型获取相应的处理类,
if (handler == null && path.length() > 1) { handler = HandlerFactory.getHandler(path); }
//依据请求的命令来获取响应的处理类 public static ChameleonRequestHandler getHandler(String cmd) { ChameleonRequestHandler handler = null; if (cmd.equalsIgnoreCase(ChameleonConstants.INDEX) || cmd.equalsIgnoreCase(ChameleonConstants.UPDATE) || cmd.equalsIgnoreCase(ChameleonConstants.CRAWLER) || cmd.equalsIgnoreCase(ChameleonConstants.DELETEQUERY) || cmd.equalsIgnoreCase(ChameleonConstants.DELETETERM)) handler = (ChameleonRequestHandler) WebAppContextUtil .getBean("indexRequestHandler"); … return handler; }
接下来就是对request的处理,首先是一个基类处理如下:
public abstract class RequestHandlerBase implements ChameleonRequestHandler{ @Override public void handle(ChameleonQueryRequest req, ChameleonQueryResponse rsp) { startHandle(req,rsp); } private void startHandle(ChameleonQueryRequest req, ChameleonQueryResponse rsp){ handleResponse(rsp,handleRequest(req)); } public abstract String handleRequest(ChameleonQueryRequest req); public abstract void handleResponse(ChameleonQueryResponse rsp,String result); } @Override public void handle(ChameleonQueryRequest req, ChameleonQueryResponse rsp) { startHandle(req,rsp); } private void startHandle(ChameleonQueryRequest req, ChameleonQueryResponse rsp){ handleResponse(rsp,handleRequest(req)); } public abstract String handleRequest(ChameleonQueryRequest req); public abstract void handleResponse(ChameleonQueryResponse rsp,String result);
每个handler都是对RequestHandlerBase扩展,需要扩展的是handleRequest和handleResponse
具体处理index的类如下:
@Override public String handleRequest(ChameleonQueryRequest req) { MasterCfgManager.getIndexPool().execute(new IndexTask(req)); return null; } @Override public void handleResponse(ChameleonQueryResponse rsp, String code) { //to do }
在系统index线程池中放入一个indextask,该线程池初始化的大小是系统cpu的个数,具体的excute执行如下代码:
@Override public void excuteProvider(ChameleonQueryRequest cqr) throws BaseException { ZooKeeperClientInfo client = CalculateLoadUtil .selector(CalculateServerType.ALL); ChameleonExcute ce = SlaveClientFactory.getInstance("", "") .createClient(ChameleonExcute.class, client.getIp()); ce.parallelMultiIndex(cqr.getBody()); }
首先依据slaves的负载情况选择一个处理的客户端,并依据此客户端获取执行实例ChameleonExcute,接下来就是请求到客户端处理实际的索引。而CalculateLoadUtil就是系统处理负载均衡模块的入口,接下来具体讲解。
循序渐进企业级搜索引擎之Master模块设计及实现-系统请求响应封装模块,布布扣,bubuko.com
循序渐进企业级搜索引擎之Master模块设计及实现-系统请求响应封装模块
原文:http://blog.csdn.net/letueodiandian/article/details/20837943