RMI工具hessian的简单使用

  1. hessian是一个轻量级二进制远程调用框架,由于使用二进制协议传输,对于跨平台、跨语言开发远程调用接口很方便。使用http协议进行通信,降低复杂性。对于开发者而言,只需要进行简单的配置或编码就可以发布hessian服务。
  2. hessian是基于http传输的,那么就需要有web容器将hessian服务发布,一般最简单的就是使用servlet来发布。而且hessian提供了一个servlet类HessianServlet,可以继承这个类,然后将自己的接口发布为hessian服务。这种方式参见官网。
  3. 下面将提供一个基于servlet3.0以上的hessian服务发布demo
  4. 环境准备:jdk1.7以上、maven
  5. 如果使用继承HessianServlet的方式,那么每发布一个服务,就意味着要编写一个servlet,而且还要额外的配置。这里我们使用servlet3.0的动态添加servlet的方式,通过ServletContextListener监听在容器启动的时候,动态发布hessian的servlet。然后只需要需要发布的服务,在配置文件中进行配置即可。
  6. 核心代码:
    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

  7. 参考资料:
    http://hessian.caucho.com/doc/hessian-overview.xtp#HessianServic
    https://blog.csdn.net/Holmofy/article/details/78570140

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值