博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Hessian源码浅析-HessianSkeleton
阅读量:6004 次
发布时间:2019-06-20

本文共 3554 字,大约阅读时间需要 11 分钟。

Hessian服务端核心对象HessianSkeleton 主要做两件事

1.把客户端请求的流反序列化  得到 对应的方法名称 参数

2. 服务类(service)对应方法执行完成 把结果序列化到输出流

hessian服务端暴露服务是通过HessianServlet 

public class HessianServlet extends GenericServlet {}

HessianServlet 的init方法主要初始化服务类(service) 和HessianSkeleton  每一个服务类对应一个HessianSkeleton  在HessianSkeleton中持有业务类的引用

public void init(ServletConfig config) throws ServletException {		super.init(config);		//web.xml中home-class,service-class配置服务的实现类		if (_homeImpl != null) {					} else if (getInitParameter("home-class") != null) {			String className = getInitParameter("home-class");			Class homeClass = loadClass(className);			_homeImpl = homeClass.newInstance();			init(_homeImpl);		} else if (getInitParameter("service-class") != null) {			String className = getInitParameter("service-class");			Class homeClass = loadClass(className);			_homeImpl = homeClass.newInstance();			init(_homeImpl);		} else {			if (getClass().equals(HessianServlet.class))				throw new ServletException(						"server must extend HessianServlet");			_homeImpl = this;		}		//web.xml配置的 服务类实现接口 		if (_homeAPI != null) {		} else if (getInitParameter("home-api") != null) {			String className = getInitParameter("home-api");			_homeAPI = loadClass(className);		} else if (getInitParameter("api-class") != null) {			String className = getInitParameter("api-class");			_homeAPI = loadClass(className);		} else if (_homeImpl != null) {			//如果没有配置服务实现类的接口  递归 找到服务类最顶层的接口			_homeAPI = findRemoteAPI(_homeImpl.getClass());			if (_homeAPI == null)				_homeAPI = _homeImpl.getClass();		}		//TODO 		_homeSkeleton = new HessianSkeleton(_homeImpl, _homeAPI);	}

service方法 

public void service(ServletRequest request, ServletResponse response)			throws IOException, ServletException {		HttpServletRequest req = (HttpServletRequest) request;		HttpServletResponse res = (HttpServletResponse) response;		//必须是post方式		if (!req.getMethod().equals("POST")) {			res.setStatus(500, "Hessian Requires POST");			PrintWriter out = res.getWriter();			res.setContentType("text/html");			out.println("

Hessian Requires POST

"); return; } String serviceId = req.getPathInfo(); String objectId = req.getParameter("id"); if (objectId == null) objectId = req.getParameter("ejbid"); //保存到ThreadLocal中 ServiceContext.begin(req, serviceId, objectId); try { InputStream is = request.getInputStream(); OutputStream os = response.getOutputStream(); response.setContentType("application/x-hessian"); SerializerFactory serializerFactory = getSerializerFactory(); //交给HessianSkeleton invoke方法处理 invoke(is, os, objectId, serializerFactory); } finally { ServiceContext.end(); } }

HessianSkeleton invoke方法核心代码 

public void invoke(Object service,                     AbstractHessianInput in,                     AbstractHessianOutput out)    throws Exception  {    //..略	//反序列化 获得方法名称    String methodName = in.readMethod();    int argLength = in.readMethodArgLength();    Method method;    //_methodMap中获得对应的方法     method = getMethod(methodName + "__" + argLength);    // ..略    Class
[]args = method.getParameterTypes(); //获得方法参数 Object []values = new Object[args.length]; for (int i = 0; i < args.length; i++) { // XXX: needs Marshal object values[i] = in.readObject(args[i]); } Object result = null; try { result = method.invoke(service, values); } catch (Exception e) { //...略 return; } in.completeCall(); // AbstractHessianOutput 序列化方法返回值 out.writeReply(result); out.close(); }

转载于:https://www.cnblogs.com/java-wl/archive/2012/05/11/2923187.html

你可能感兴趣的文章
题解——loj6280 数列分块入门4 (分块)
查看>>
Nginx配置文件nginx.conf详解
查看>>
Ubuntu下实现socks代理转http代理
查看>>
使用PL/SQL能查询oracle中数据,在for update 语句中一直卡住
查看>>
05机器学习实战之Logistic 回归scikit-learn实现
查看>>
libevent evbuffer参考文章
查看>>
用python爬取app照片
查看>>
ASP.NET状态管理
查看>>
hashcode equals
查看>>
MFC–2
查看>>
取消快捷方式中的箭头图标
查看>>
Oracle中如何插入特殊字符:& 和 ' (多种解决方案)
查看>>
layer 如何加上关闭框
查看>>
node+express搭建个人网站(2)
查看>>
儿童天赋脚本
查看>>
HBase之创建表
查看>>
abstract关键字
查看>>
面向对象编程(六)——重载
查看>>
几种字符串处理的题
查看>>
[Hive_add_1] Hive 与 MR 的对应关系
查看>>