hessian基于HessianServlet方式实现,加入servlet动态代理机制!

来源:互联网 发布:遗传算法matlab 多参数 编辑:程序博客网 时间:2024/06/06 20:18

最近因为项目中需要基于hessian进行RPC的服务消息传输应用!实现方式因为hessian新版不能支持spring老的版本原因,导至无法应用集成spring 的HessianServiceExporter实现处理。只能实现HessianServlet方式了!

但考滤到应用中可能涉及到多业务需要实现,涉及到多HessianServlet.这样配置很不方便!并通过网上参考定义以下动态代理servlet!

public class HessianServletProxyBean extends GenericServlet {
    private static final Log log = LogFactory.getLog(HessianServletProxyBean.class);
        public void init() throws ServletException {
            log.info("HessianServletProxyBean init.....");
            String targetBean = getInitParameter("targetBean");
            getServletBean(targetBean);
            Map instanceMap=InstanceServletPool.get_classPool();
            if(instanceMap!=null&&instanceMap.size()>0){
                Iterator it = instanceMap.entrySet().iterator();
                while(it.hasNext()){
                    Map.Entry<String, Servlet> servletBeanEntry = (Entry<String, Servlet>) it.next();
                    Servlet servletBean = servletBeanEntry.getValue();
                    servletBean.init(getServletConfig());
                }
            }
        }

        public void service(ServletRequest req, ServletResponse res)throws ServletException, IOException {
            HttpServletRequest req1 = (HttpServletRequest) req;
            //hessian接口 调用时url需要写入Spring中对应beanName,如:http://localhost:80/hessian/remote/basicService2.h
            String requUrl=req1.getRequestURL().toString();
            log.info(requUrl);
            String servletBeanName=requUrl.substring(requUrl.lastIndexOf("/")+1, requUrl.lastIndexOf("."));
            InstanceServletPool.get(servletBeanName).service(req, res);
        }
        /**
         * 通过bean名称初始化多个servlet并放入实例的servlet池中
         * @param targetBean 逗号分隔bean名称
         */
        private void getServletBean(String targetBean) {
            ApplicationContext context = WebApplicationContextUtils.getRequiredWebApplicationContext(this.getServletContext());
            if(targetBean!=null&&!targetBean.trim().equals("")){
                String servletBeans[]=targetBean.split(",");
                for(int i=0;i<servletBeans.length;i++){
                    Servlet    servletBean=(Servlet) context.getBean(servletBeans[i]);
                    InstanceServletPool.put(servletBeans[i], servletBean);
                }
            }

        }


web.xml中配置:

<!-- 代理 hessian的servlet调用 -->
    <servlet>
        <servlet-name>HessianServletProxyBean</servlet-name>
        <servlet-class>com.web.HessianServletProxyBean</servlet-class>
        <init-param>
            <param-name>targetBean</param-name>
            <param-value>basicService,basicService2</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>HessianServletProxyBean</servlet-name>
        <url-pattern>*.hes</url-pattern>
    </servlet-mapping>

============================================================

clientTest.java

public static void main(String[] args) throws Exception{
        // TODO Auto-generated method stub

        //String url = "http://localhost:80/hessian/remote/basicService.hes";
        String url = "http://localhost:80/hessian/remote1/basicService2.hes";
        HessianProxyFactory factory = new HessianProxyFactory();
        BasicAPI basic = (BasicAPI) factory.create(BasicAPI.class, url);

        System.out.println("hello(): " + basic.hello());
        
        System.out.println("getUserVo(): "+basic.getUserVo());
        
        System.out.println("getUserVos(): "+basic.getUserVos());

    }


================================================================================

private String _greeting = "Hello, world2222222222222222222222222222222222";
  private DSA dsaService;
  public void setGreeting(String greeting){
    _greeting = greeting;
  }

  public String hello(){
      dsaService.printlnSignature();
    return _greeting;
  }
 
      public UserVo getUserVo(){
          UserVo vo = new UserVo();
          vo.setId("001222222222222222222222");
          vo.setName("我是汉字22222222222222222");
          vo.setEmail("hanzi@sina.com22222222222222222222222222");
          return vo;
      }

    public List<UserVo> getUserVos() {
        List<UserVo> vos = new ArrayList<UserVo>();
        for (int i = 0; i < 10; i++) {
            UserVo vo = new UserVo();
            vo.setId("00222222222222222222222222"+i);
            vo.setName("我是汉字2222222222222222222222"+i);
            vo.setEmail("hanzi22222222222222222222222"+i+"@sina.com2222222222222222222");
            vos.add(vo);
        }
        return vos;
    }

    public DSA getDsaService() {
        return dsaService;
    }

    public void setDsaService(DSA dsaService) {
        this.dsaService = dsaService;
    }
}

======================================================================

spring配置:

    <bean id="dsaService" class="com.dsa.security.DSAService">
        <property name="publicKey" value="classpath:deciphering.publickey" />
    </bean>
    
    <bean id="basicService" class="com.baijob.search.BasicService"></bean>
    <bean id="basicService2" class="com.baijob.search.BasicService2">
        <property name="dsaService" ref="dsaService"/>  
    </bean>


完整项目下载地址:  http://download.csdn.net/detail/wanj78/4015967