`

远程调用 - spring+rmi

阅读更多

Spring提供类用于集成各种远程访问技术。这种对远程访问的支持可以降低你在用POJO实现支持远程访问业务时的开发难度。目前,Spring提供对下面四种远程访问技术的支持:

  • 远程方法调用(RMI)。通过使用RmiProxyFactoryBeanRmiServiceExporter,Spring支持传统的RMI(使用java.rmi.Remote interfaces 和 java.rmi.RemoteException)和通过RMI调用器(可以使用任何Java接口)的透明远程调用。

  • Spring的HTTP调用器。Spring提供一种特殊的远程调用策略支持任何Java接口(象RMI调用器一样),它允许Java序列化能够通过HTTP传送。对应的支持类是HttpInvokerProxyFactoryBeanHttpInvokerServiceExporter

  • Hessian。通过使用HessianProxyFactoryBeanHessianServiceExporter,你可以使用Caucho提供的轻量级基于HTTP的二进制协议透明地提供你的业务。

  • Burlap。Burlap是基于XML的,它可以完全代替Hessian。Spring提供的支持类有BurlapProxyFactoryBeanBurlapServiceExporter

  • JAX RPC (TODO).

    RMI是不能够穿越防火墙的,在网上也查了一些资料,但根据其提供的方法都没有成功,唉,功夫不负有心人,经过一番努力,还是把它实现了,其实这东西就是一层窗纸,捅破了也没有什么太难得,废话不说了,我们开始吧。(不好意思,还得再说一句废话:得益于罗士飞的那本spring教程代码)。

     

    在此之前,我先把目录结构抓取个图像给大家看看。

    当然首先要把spring的相关依赖的jar包引入了。这里就不能描述了。

    先写服务器段代码:
    1. 定义接口 ILogPerson.java
    package com.openv.spring;

    public interface ILogPerson {
         public String getPersion(PersonVO personVO);
    }

    2. 定义POJO PersonVO.java
    package com.openv.spring;

    import java.io.Serializable;

    public class PersonVO implements Serializable {
         private String firstname;
         private String lastname;

         public String getFirstname() {
             return firstname;
         }

         public void setFirstname(String firstname) {
             this.firstname = firstname;
         }

         public String getLastname() {
             return lastname;
         }

         public void setLastname(String lastname) {
             this.lastname = lastname;
         }
    }

    注意:这里的PersonVO.java 必须继承Serializable 以实现序列化,不然会抱错,谨记!


    3. 定义实现:LogPerson.java
    package com.openv.spring;

    public class LogPerson implements ILogPerson{

         public String getPersion(PersonVO personVO) {
             return personVO.getFirstname()+" @#@ "+personVO.getLastname();  
         }
    }

    4. 定义spring的依赖注入的文件appcontextrmiserver.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
        "
    http://www.springframework.org/dtd/spring-beans.dtd">
    <beans>

    <bean id="logPerson" class="com.openv.spring.LogPerson"/>

    <bean id="logPersonService"
          class="org.springframework.remoting.rmi.RmiServiceExporter">
      <!-- RmiServiceExporter 对服务名没有特殊要求 -->
       <property name="serviceName">
        <value>LogPerson</value>
       </property>
       <property name="service">
        <ref bean="logPerson"/>
       </property>
       <property name="serviceInterface">
        <value>com.openv.spring.ILogPerson</value>
       </property>
      <!-- 避免与默认的RMI注册端口冲突,因此修改为1200 -->
       <property name="registryPort">
        <value>1200</value>
       </property>
    </bean>

    </beans>

    5. 定义运行rmi服务的类: LogPersonRmiServer.java
    package com.openv.spring;

    import org.springframework.core.io.Resource;
    import org.springframework.core.io.ClassPathResource;
    import org.springframework.beans.factory.xml.XmlBeanFactory;
    import org.springframework.beans.factory.BeanFactory;

    import java.io.Serializable;

    public class LogPersonRmiServer{
         public static void main(String[] args) {
             //初始化appcontextrmiserver.xml
             Resource sresource = new ClassPathResource("appcontextrmiserver.xml");
             BeanFactory sfactory = new XmlBeanFactory(sresource);

             //注册RMI
             sfactory.getBean("logPersonService");

         }
    }

    运行main函数,rmi服务就启动了。

    下面写客户调用端的代码了。
    大家从目录图中看一下,为了调试方便,我把服务端和客户端写在了一起。在实际的项目中,客户端的代码是不可能和服务器端在一起的,那样还叫什么远程调用呀,呵呵。在实际的项目中,我们应该把接口ILogPerson.java和POJO PersonVO.java 文件打成jar包给客户端引用即可,而实现是在服务器端完成。

    下面我们可以在另外一台计算机(为了强调远程嘛,呵呵)上新建立一个客户端调用的工程。客户端很简单

    1. 引入spring的依赖文件和 接口ILogPerson.java和POJO PersonVO.java 文件打成jar包

    2. spring的依赖注入的文件 appcontextrmiclient.xml
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
        "
    http://www.springframework.org/dtd/spring-beans.dtd">
    <beans>
    <bean id="LogPerson"
       class="org.springframework.remoting.rmi.RmiProxyFactoryBean">
       <property name="serviceUrl"><value>rmi://77.20.64.237:1200/LogPerson</value></property>
       <property name="serviceInterface"><value>com.openv.spring.ILogPerson</value></property>
    </bean>
    </beans>

    3. 调用文件 LogPersonRmiClient.java
    package com.openv.spring;

    import org.springframework.beans.factory.BeanFactory;
    import org.springframework.beans.factory.xml.XmlBeanFactory;
    import org.springframework.core.io.ClassPathResource;
    import org.springframework.core.io.Resource;

    public class LogPersonRmiClient {
         public static void main(String[] args) {
            //初始化appcontextrmiclient.xml
             Resource cresource = new ClassPathResource("appcontextrmiclient.xml");
             BeanFactory cfactory = new XmlBeanFactory(cresource);

            //实例化Person值对象
             PersonVO personVO = new PersonVO();
             personVO.setFirstname("Luo2");
             personVO.setLastname("Shifei");

            //获得RMI服务
             ILogPerson clientLog = (ILogPerson) cfactory.getBean("LogPerson");

            //调用RMI服务
             System.out.println("==>> " + clientLog.getPersion(personVO));
         }
    }
    客户端很简单的,呵呵。看看运行结果吧。

    虽然简单,但是也有四五个文件,其实每个文件不是很复杂,只要耐着心思把其一个个写出来,就能成功,如果运行结果出来了,你对rmi的各种疑惑也就形如冰释了。我也搞了大半天才将其实现,愿能给参看的朋友一些提示。

  • 经过spring的封装,rmi的复杂过程得到了很大的简化,基本变成了配置的过程,什么rmi手工注册和声成什么乱七八糟的文件都省略了。不过不能穿越防火墙,下面我们在介绍一种可以穿越防火墙的spring远程调用hissian

  • 转载自: http://hi.baidu.com/wingis/blog/item/b12e538baa13f4d8fd1f1089.html/cmtid/792663112267db73cb80c433

  •  

  • 分享到:
    评论

    相关推荐

      java spring+rmi 的远程调用例子

      一个基于Spring的rmi实现,测试成功,可以远程调用。

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

      1. 远程调用RMI(Remote Method Invocation): 通过使用 RmiProxyFactoryBean 和 RmiServiceExporter,并且,Spring支持两个传统的RMI(使用 java.rmi.Remote接口和java.rmi.RemoteException)和通过RMI调用器实现的...

      spring RMI 远程接口调用

      spring RMI 远程接口调用 包含服务端客户端程序,可完整运行

      三种方式实现java远程调用(rmi),绝对可用

      三种方式实现java远程调用(rmi) 方式一:原始方式 方式二:spring 方式三:jndi 解压,放到myeclipse上可用

      Spring-RMI.rar_spring rmi

      Spring整合RMI的使用,实现不同项目间方法的远程调用。

      RMI远程调用

      RMI远程调用,之前做的Demo希望对大家有所帮助!

      搞定J2EE:STRUTS+SPRING+HIBERNATE整合详解与典型案例 (1)

      1.4.8 RMI(远程方法调用) 1.4.9 JMS(Java消息服务) 1.4.10 JMX(Java分布式管理) 1.4.11 JACC(Java容器授权合同) 1.4.12 JCA(Java连接器体系) 1.5 小结 第二章 MVC模式介绍 2.1 MVC模式概述 2.1.1 MVC模式...

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

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

      spring rmi 源码

      spring rmi 远程调用服务端和客户端源码,eclipse环境,jdk1.7.

      word源码java-fleet-spring-boot:SpringBoot教程,SpringBoot的各种简单示例,快速入门使用Sprin

      word源码java fleet-spring-boot ...远程调用框架 :Spring Boot Hessian 远程调用框架 :Spring Boot Forest Http 请求 :Spring Boot HTTP 访问控制 :Spring Boot GraphQL 构建 API :Spring Boot

      远程调用服务框架

      给予spring的框架。 封装了xfire、rmi、hessian、httpinvoker 客户端可以统一调用,省略了远程调用的编码。 服务通过服务ID和服务接口来调用。

      搞定J2EE:STRUTS+SPRING+HIBERNATE整合详解与典型案例 (3)

      1.4.8 RMI(远程方法调用) 1.4.9 JMS(Java消息服务) 1.4.10 JMX(Java分布式管理) 1.4.11 JACC(Java容器授权合同) 1.4.12 JCA(Java连接器体系) 1.5 小结 第二章 MVC模式介绍 2.1 MVC模式概述 2.1.1 MVC模式...

      搞定J2EE:STRUTS+SPRING+HIBERNATE整合详解与典型案例 (2)

      1.4.8 RMI(远程方法调用) 1.4.9 JMS(Java消息服务) 1.4.10 JMX(Java分布式管理) 1.4.11 JACC(Java容器授权合同) 1.4.12 JCA(Java连接器体系) 1.5 小结 第二章 MVC模式介绍 2.1 MVC模式概述 2.1.1 MVC模式...

      spring jar 包详解

      (9) spring-remoting.jar 这个jar文件包含支持EJB、JMS、远程调用Remoting(RMI、Hessian、Burlap、Http Invoker、JAX-RPC)方面的类。 (10) spring-support.jar 这个jar文件包含支持缓存Cache(ehcache)、JCA、...

      Spring 2.5 jar 所有开发包及完整文档及项目开发实例

       这个jar文件包含支持EJB、JMS、远程调用Remoting(RMI、Hessian、Burlap、Http Invoker、JAX-RPC)方面的类。 (10) spring-support.jar  这个jar文件包含支持缓存Cache(ehcache)、JCA、JMX、邮件服务(Java ...

      cobra-rmi-iiop:Cobra协议中的分布式对象范例和远程方法调用的示例

      RMI-IIOP (称为“ IIOP上的RMI”)表示Internet球间协议(IIOP)上的Java远程方法调用(RMI)接口,该接口向Java平台提供了通用对象请求代理体系结构(CORBA)分布式计算功能。 更多信息 : 建造 编译项目文件 转...

      Spring-Reference_zh_CN(Spring中文参考手册)

      2. Spring 2.0 的新特性 2.1. 简介 2.2. 控制反转(IoC)容器 2.2.1. 更简单的XML配置 2.2.2. 新的bean作用域 2.2.3. 可扩展的XML编写 2.3. 面向切面编程(AOP) 2.3.1. 更加简单的AOP XML配置 2.3.2. 对@AspectJ 切面的...

      最新最全的spring开发包

       这个jar文件包含支持EJB、JMS、远程调用Remoting(RMI、Hessian、Burlap、Http Invoker、JAX-RPC)方面的类。 (10) spring-support.jar  这个jar文件包含支持缓存Cache(ehcache)、JCA、JMX、邮件服务(Java ...

      Spring2.52 开发手册

      Spring为编写企业应用程序提供了轻量的解决方案,同时仍然支持使用声明式事务、 用RMI或web service远程调用、以及使用多种方式来将数据持久化到数据库。Spring提供了全功能的 MVC framework, 以及透明集成AOP到你...

      Spring-Reference_zh_CN

      Spring为编写企业应用程序提供了轻量的解决方案,同时仍然支持使用声明式事务、 用RMI或web service远程调用、以及使用多种方式来将数据持久化到数据库。Spring提供了全功能的 MVC framework, 以及透明集成AOP到你...

    Global site tag (gtag.js) - Google Analytics