`
543334061
  • 浏览: 11943 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

spring整合hessain远程访问

 
阅读更多

1.1 Hessian简介      

       Hessian是一个轻量级的Web服务实现工具,它采用的是二进制协议,因此很适合发送二进制数据。它的一个基本原理就是把远程服务对象以二进制的方式进行发送和接收
1.2 整合
1.2.1 概述

   对于Hessian而言,有服务端和客户端,所以我们的整合也需要分服务端的整合和客户端的整合。服务端的整合是通过SpringMVC进行的,而客户端的整合则是通过Spring的bean进行的

1.2.2 服务端整合
     

[code="java"]public interface CouponService {

public void add();
        public void update();
        public void delete();
}

 
      我们再建一个实现接口 CouponServiceImpl:
     

          public  class CouponServiceImpl implements CouponService{
  
          public void add(){
            System.out.println("-----add------");
          }
           public void update(){
            System.out.println("-----update------");
          }
          public void delete(){
            System.out.println("-----delete------");
          }
   }

 
       那么接下来我们要做的就是把UserServiceImpl作为一个远程服务进行发布,以致客户端能够进行访问。 首先我们需要在web.xml中配置一个SpringMVC的DispatcherServlet用于接收所有的Web服务请求,这里我们这样配置:
     

<servlet>
	<servlet-name>remote</servlet-name>
	<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
	<init-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>classpath:bean-hessian.xml</param-value>
	</init-param>
	<load-on-startup>1</load-on-startup>                      
</servlet>

	<servlet-mapping>
		  <servlet-name>remote</servlet-name>
		  <url-pattern>/remote/*</url-pattern>
	</servlet-mapping>

 
      可以看到我们这个DispatcherServlet会处理url为“/remote/*”的请求,通配符“*”就对应着我们的处理器映射。

      接下来就是在SpringMVC的配置文件中利用Hessian来定义我们的远程服务了,这是通过Spring提供的HessianServiceExporter来实现的。我们需要在SpringMVC的配置文件中定义一个类型为HessianServiceExporter的bean对象。该bean对象需要接收两个属性,一个是service属性,用于关联真正的service对象,另一个是serviceInterface属性,用于指定当前的服务对应的接口。HessianServiceExporter实现了HttpRequestHandler接口,当我们请求某一个远程服务的时候实际上请求的就是其对应的HessianServiceExporter对象,HessianServiceExporter会把请求的服务以二进制的方式返回给客户端。这里我们在SpringMVC的配置文件中这样定义
  

<bean id="couponService" class="com.coupon.service.rpc.CouponServiceImpl">
<bean name="/couponService" class="org.springframework.remoting.caucho.HessianServiceExporter">
	<property name="service" ref="couponService" />
	<property name="serviceInterface" value="com.xebest.api.coupon.CouponService" />
</bean>

 
   注意,因为是根据beanName来进行映射的,所以我们必须要给HessianServiceExporter bean对象指定name属性,而且其对应的name必须以“/”开头,这样我们的客户端才能访问到对应的服务。


1.2.3 客户端 rpc  自定义工厂调用
   

      跟服务端对应的接口

    package com.tiantian.hessianserver.service;

    public interface CouponService {

        public void add();
        public void update();
        public void delete();
}

 
   这时候可以用spring配置文件整合也可以自己写一个工厂类去调用  在这里我们写一个工厂类类去调用
  

import java.net.MalformedURLException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Random;

import org.apache.commons.configuration.ConfigurationException;
import org.apache.commons.configuration.XMLConfiguration;
import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.caucho.hessian.client.HessianProxyFactory;

public class CouponServiceFactory {
	
	private static Logger log = LoggerFactory.getLogger(CouponServiceFactory.class);
	
	private static int nodeCount;
	
	private static class LazyHolder{
		private static final CouponServiceFactory INSTANCE= new CouponServiceFactory();
	}
	public static CouponServiceFactory getInstance() {
		return LazyHolder.INSTANCE;
	}
    private CouponServiceFactory(){
    	init();
    }
    private static Map<String, CouponService> couponService = new  HashMap<String, CouponService>();
   
    /**
     * 实例化
     * PassportServiceFactory.instanceService()<BR>
     * <P>Author :  hz </P>  
     * <P>Date : 2014-1-24 </P>
     * @return
     */
    public CouponService instanceService(){
		Random rnd = new Random();
		int i = rnd.nextInt(nodeCount);
		String index = "node" + i;
		if (couponService.get(index) != null) {
			return couponService.get(index);
		}
    	return null;
    }

    /**
     * 初始化
     * PassportServiceFactory.init()<BR>
     * <P>Author :  hz </P>  
     * <P>Date : 2014-1-24 </P>
     */
	private static void init(){
		XMLConfiguration wsConfigManager = null;
    	try {
    		wsConfigManager = new XMLConfiguration("xe-coupon-service.xml");
		} catch (ConfigurationException e) {
			e.printStackTrace();
		}
		List<Object> nodeList = wsConfigManager.getList("cluster.snode.id");
		if(nodeList.size()==0) return ;
		
		nodeCount = nodeList.size();
		for(int nodeIndex=0;nodeIndex<nodeList.size();nodeIndex++){
			String url = wsConfigManager.getString("cluster.snode("+nodeIndex+").url");
			String serviceName = wsConfigManager.getString("cluster.snode("+nodeIndex+").serviceName");
			String hessianServiceName = wsConfigManager.getString("cluster.snode("+nodeIndex+").hessianServiceName");
			String wsdlURL = "";
			if(StringUtils.isNotBlank(serviceName))
			{
				wsdlURL = "http://"+url + "/"+serviceName+"/"+hessianServiceName;
			}
			else
			{
				wsdlURL = "http://"+url + "/" +hessianServiceName;
			}
			log.info("url:==>" + wsdlURL);
			HessianProxyFactory hp = new HessianProxyFactory();
			hp.setOverloadEnabled(true);
			try {
				couponService.put("node" + nodeIndex, (CouponService) hp.create(CouponService.class,wsdlURL));
			} catch (MalformedURLException e) {
			}
		}
	}
}

 
    xml配置文件:xe-coupon-service.xml
   

<?xml version="1.0" encoding="UTF-8"?>
<test-service>
	<!-- web service xfire配置开始 -->
	<cluster>
		<id>test-server</id>
		<snode>
			<id>snode2</id>
 			<url>qa-manager-new.xebest.com</url> 
			<hessianServiceName>remote/couponService</hessianServiceName>
			<trailnumber></trailnumber>
			<hessianuser></hessianuser>
		</snode>
	</cluster>
	<!-- web service xfire 配置结束 -->
</test-service>

 
   调用 :

 public class Demo{
   //获取接口
   CouponService couponService=CouponServiceFactory.getInstance.instanceService();
   couponService.add();
   couponService.update();
   couponService.delete();
}

  1.2.4 也可以用spring 配置文件调用:
    接口:

    package com.tiantian.hessianserver.service;

   public interface CouponService {

        public void add();
        public void update();
        public void delete();
}

    spring的配置文件:
 

<bean name="couponService" class="org.springframework.remoting.caucho.HessianProxyFactoryBean">
      <property name="serviceUrl" value="http://qa-manager-new.xebest.com/remote/couponService" />
      <property name="serviceInterface" value="com.tiantian.hessianserver.service.CouponService"/>
</bean>

  调用:
 

 public class Demo{
     
     @Auwrite 
     CouponService couponService;
    couponService.add();
    couponService.update();
    couponService.delete();

  }

 

 

 

 

 

 

分享到:
评论

相关推荐

    Mybatis与Spring整合所需的jar包

    mybatis与spring整合时所依赖的jar包,包括: 1.Mybatis所需的jar包括: ant-1.9.6.jar ant-launcher-1.9.6.jar asm-5.2.jar cglib-3.2.5.jar commons-logging-1.2.jar javassist-3.22.0-CR2.jar log4j-...

    Spring 实现远程访问详解——rmi

    Spring为各种远程访问技术提供集成工具类。Spring远程访问通过使用普通POJOs,能更容易的开发远程访问服务。目前,Spring远程访问的主要技术如下: 1. 远程调用RMI(Remote Method Invocation): 通过使用 ...

    mybatis与spring整合的全部jar包

    SSM(Spring、SpringMVC、MyBatis)框架整合是Java开发中常见的技术栈,主要用于构建企业级的Web应用程序。在这个压缩包中,我们找到了整合MyBatis和Spring所需的全部jar包,这对于初学者或者开发者搭建项目环境非常...

    Spring 实现远程访问详解——httpinvoker

    上文我们利用Spring rmi实现了Spring的远程访问(Spring 实现远程访问详解——rmi),本文主要讲解利用HttpInvoke实现远程访问。 Spring httpInvoker使用标准java序列化机制,通过Http暴露业务服务。如果你的参数和...

    mybatis与spring整合全部jar包

    SSM(Spring、SpringMVC、MyBatis)是一个经典的Java web开发框架组合,它将Spring作为核心容器,SpringMVC作为控制层,MyBatis作为数据访问层,提供了高效且灵活的Java web应用程序开发解决方案。这个“mybatis与...

    mybatis-spring 整合jar包

    mybatis-spring 整合jar包,Spring和MyBatis环境整合mybatis-spring-1.1.1

    iBatis和Spring整合

    iBatis和Spring整合 iBatis和Spring整合

    cxf+spring整合

    Spring还包含一套完整的数据访问、事务管理、安全性和远程服务支持的组件,使得开发者能够构建健壮且模块化的应用程序。 3. **CXF与Spring的整合** 将CXF与Spring整合,可以利用Spring的DI特性来管理CXF服务及其...

    spring_mybatis 整合jar包

    在Java开发领域,Spring框架和MyBatis框架的整合是常见的数据访问技术组合。Spring作为一个全面的开源应用框架,提供依赖注入(DI)和面向切面编程(AOP)等功能,而MyBatis则是一个轻量级的持久层框架,专注于SQL...

    Spring整合Hessian访问远程服务

    本篇文章将深入探讨如何将Spring与Hessian整合,以便在分布式系统中轻松实现远程服务调用。 首先,让我们理解Spring整合Hessian的基本原理。Spring通过其强大的IoC(Inversion of Control)容器管理服务和客户端,...

    基于Spring的远程访问与Web Service

    基于Spring的远程访问与Web Service

    spring整合Mybatis

    在IT行业中,Spring框架与Mybatis的整合是常见的企业级应用开发模式,它结合了Spring的强大功能和Mybatis的灵活性,使得数据访问更加高效。本文将深入探讨如何进行"Spring整合Mybatis"的基础搭建,以及涉及到的相关...

    spring整合

    总之,Spring整合涵盖了许多方面,从数据访问到Web开发,再到微服务和安全,Spring提供了一整套解决方案,使得开发者能够构建复杂的企业级应用。掌握Spring整合的技巧,对于提升开发效率和构建高质量软件至关重要。

    Spring 整合 Flex 包

    通过使用 Spring BlazeDS Integration,可以轻松地在 Flex 客户端和 Spring 服务之间建立双向数据绑定,实现高效的远程调用(Remote Procedure Call,RPC)机制。 Spring Flex 提供了以下关键组件和特性: 1. **...

    spring整合elasticsearch-2.3.5

    本示例程序主要是spring 整合elasticsearch-2.3.5的实践,测试时先将配置文件es.properties中ES服务端es.ip,es.port, es.cluster 配置替换成自己的服务器信息

    hibernate与spring整合demo

    将Hibernate与Spring整合可以充分利用两者的优点,提高开发效率并降低复杂性。 一、Hibernate概述 Hibernate是Java世界中领先的ORM框架之一,它允许开发者用Java对象来操作数据库记录,而无需编写SQL语句。通过配置...

    mybatis-spring整合简单的实例代码

    【标题】"mybatis-spring整合简单实例代码"所涉及的知识点主要集中在如何将MyBatis与Spring框架进行集成,以便在Spring应用中利用MyBatis进行数据访问。这一过程通常包括以下几个关键步骤: 1. **环境配置**:首先...

    Spring整合CXF发布服务

    当我们需要在Spring环境中发布Web服务时,Spring与CXF的整合就显得尤为重要。本篇文章将深入探讨如何实现Spring与CXF的整合,以便发布服务。 1. **Spring与CXF整合的基础** 在整合Spring和CXF之前,我们需要确保...

    xfire+Spring整合

    当我们将XFire与Spring进行整合时,我们可以利用Spring的强大功能来管理Web服务的生命周期,并且更容易地集成到现有的Spring应用中。 XFire与Spring的整合主要涉及以下几个关键知识点: 1. **Spring的Bean管理**:...

Global site tag (gtag.js) - Google Analytics