- hessian是一个轻量级二进制远程调用框架,由于使用二进制协议传输,对于跨平台、跨语言开发远程调用接口很方便。使用http协议进行通信,降低复杂性。对于开发者而言,只需要进行简单的配置或编码就可以发布hessian服务。
- hessian是基于http传输的,那么就需要有web容器将hessian服务发布,一般最简单的就是使用servlet来发布。而且hessian提供了一个servlet类HessianServlet,可以继承这个类,然后将自己的接口发布为hessian服务。这种方式参见官网。
- 下面将提供一个基于servlet3.0以上的hessian服务发布demo
- 环境准备:jdk1.7以上、maven
- 如果使用继承HessianServlet的方式,那么每发布一个服务,就意味着要编写一个servlet,而且还要额外的配置。这里我们使用servlet3.0的动态添加servlet的方式,通过ServletContextListener监听在容器启动的时候,动态发布hessian的servlet。然后只需要需要发布的服务,在配置文件中进行配置即可。
- 核心代码:
ServletContextListener{ @Override public void contextInitialized(ServletContextEvent sce) { try { register(sce.getServletContext()); } catch (Exception e) { e.printStackTrace(); } } @Override public void contextDestroyed(ServletContextEvent sce) { System.out.println("-----容器停止后调用(在所有servlet和filter销毁后执行)-------"); } private static Set<String> getAllConfigs() throws Exception{ DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder(); Document document = builder.parse(Thread.currentThread().getContextClassLoader().getResourceAsStream(HessianConstant.HESSIAN_SERVICE_CONFIG_FILE)); Element rootElement = document.getDocumentElement(); NodeList nodeList = rootElement.getElementsByTagName(HessianConstant.HESSIAN_CONFIG_OBJECT); int len = nodeList.getLength(); if(len ==0) return null; Set<String> set = new HashSet<String>(); for(int i=0;i<len;i++) { Element element = (Element)nodeList.item(i); if(element == null || element.getTextContent() ==null || "".equals(element.getTextContent().trim())) continue; set.add(element.getTextContent().trim()); } return set; } private void register(ServletContext sc) throws Exception { Set<String> setConf = getAllConfigs(); if(setConf != null && setConf.size() >0) { Iterator<String> it = setConf.iterator(); while(it.hasNext()) { String className = it.next(); String simpleName = getSimpleName(className); ServletRegistration sr = sc.addServlet(simpleName+HessianConstant.HESSION_SERVLET_NAME_SUFFIX, HessianServlet.class); sr.setInitParameter(HessianConstant.HESSIAN_SERVICE_CLASS, className); sr.addMapping("/hessian/" + simpleName + HessianConstant.HESSIAN_SUFFIX); } } } private String getSimpleName(String className) { String simpleName = className.substring(className.lastIndexOf(".") + 1); if(simpleName.endsWith("Impl")) { return lowerCase(simpleName.substring(0,simpleName.length()-4)); } return lowerCase(simpleName); } private static String lowerCase(String str) { if(str !=null && str.length() >1) { char[] cs=str.toCharArray(); cs[0]+=32; return String.valueOf(cs); } return str; } }
完整代码参见:https://github.com/poetLoo/hessian/tree/master/hessionServices
-
参考资料:
http://hessian.caucho.com/doc/hessian-overview.xtp#HessianServic
https://blog.csdn.net/Holmofy/article/details/78570140
RMI工具hessian的简单使用
最新推荐文章于 2023-08-23 18:21:19 发布